/* NAME: DESCRIPTION: matrix改名和排序 PARAMETER: [ { name : 'step_filter', title : 'Step过滤', type : 'LineEdit', property : {tool_tip : '过滤step信息'} }, { name : 'rename_rule', title : '改名规则', type : 'TextEdit', property : {tool_tip : '支持正则匹配'}, setter:function(obj,value,self){ obj.setPlainText(value); }, getter:function(obj,self){ return obj.plainText } }, { name : 'sort_rule', title : '排序规则', type : 'TextEdit', property : {tool_tip : '支持正则匹配'}, setter:function(obj,value,self){ obj.setPlainText(value); }, getter:function(obj,self){ return obj.plainText } }, { name : 'auto_save', title : '自动保存', type : 'RadioBox', property : { item_list:[ {name:'yes',text:'YES'}, {name:'no',text:'NO'}, ], tool_tip:'是否自动保存料号开关' } } ] VERSION_HISTORY: V1.00 2020 3-30 Scott HELP:

功能简介

matrix改名和排序


参数配置

matrix改名和排序规则

注意事项

● 无


*/ // 引入模块 包 var $ = require('topcam.scriptfunc').argv(); var fs = require('fs'); var _ = require('lodash'); var IKM = $.ikm; var GEN = $.gen; var GUI = $.gui; var Job = $.job; try { var config = { rename: { rule1: [ { orig_name : 'd_top_.+(\\d+)', new_name : 'd1-(1)' }, { orig_name : 'd_.+(\\d+)_bottom', new_name : 'd(1)-(last)' }, { orig_name : 'd_.+(\\d+)_.+(\\d+)', new_name : 'd(1)-(2)'} ] }, sort: [ {name:'comp_+_top',context:'board',type:'components',polarity:'positive'}, {name:'sst',context:'board',type:'solder_paste',polarity:'positive'}, {name:'spt',context:'board',type:'solder_paste',polarity:'positive'}, {name:'smt',context:'board',type:'solder_mask',polarity:'positive'}, {name:'top',context:'board',type:'signal',polarity:'positive'}, {name:'isl(\\d+)',context:'board',type:'signal',polarity:'positive'}, {name:'bottom',context:'board',type:'signal',polarity:'positive'}, {name:'smb',context:'board',type:'solder_mask',polarity:'positive'}, {name:'spb',context:'board',type:'solder_paste',polarity:'positive'}, {name:'ssb',context:'board',type:'solder_paste',polarity:'positive'}, {name:'comp_+_bot',context:'board',type:'components',polarity:'positive'}, {name:'d(\\d+)-\\d+',context:'board',type:'drill',polarity:'positive'}, {name:'drill',context:'board',type:'drill',polarity:'positive'}, {name:'rout',context:'board',type:'rout',polarity:'positive'} ], setDrill: 'yes', auto_save:'yes' } var job = "1" if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" } if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})} if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } GEN.checkInout({job:job,mode:"out"}); if(config.rename){ reName({job:job,rule:config.rename}) } if(config.sort.length){ sortLayer({job:job, rule:config.sort}); // 排序 } if(/^yes$/.test(config.setDrill)){ setDrill({job:job}); // 设置钻孔 } // finally if (/^yes$/ig.test(config.auto_save)) { GEN.saveJob({ job: job }); } GEN.checkInout({job:job,mode:"in"}); GEN.closeJob({job:job}) return 'Done'; } catch (error) { GUI.msg(error); return 'Error'; } function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则} var job = props.job if(Array.isArray(props.rule)){ props.rule = {rule: props.rule } } var matrix = GEN.getMatrix({job:job}); // 获取matrix var matrixNames = Object.keys(matrix) // 获取数组 matrix的name var signalCount = matrixNames.reduce(function(a,b){ if(matrix[b].context == "board" && matrix[b].layer_type=="signal"){ a++ } return a },0) var reNameList = []; // 记录匹配程度最高的改名结果 Object.keys(props.rule).forEach(function(key){ var rule = props.rule[key]; var renames = getRenameCount(matrixNames,rule, signalCount); // 根据规则 和 matrixNames 的到更改名称数据 if(renames.length > reNameList.length){ // 找到匹配规则最多的 reNameList = renames; } }) // 更改层名 reNameList.forEach(function(v){ if(v.orig_name !== v.new_name){ GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name}) } }); } function getRenameCount(names,rule,signalCount){ // 返回改名匹配结果 var res = names.reduce(function(res, name){ rule.map(function(rule){ if(rule.orig_name === name){ res.push({orig_name:name, new_name:rule.new_name}); } else if(eval("/^"+rule.orig_name+"$/ig.test(name)")) { if(/\(.*\)/ig.test(rule.orig_name)){ var exec = eval("/"+rule.orig_name+"/ig.exec(name)").slice(1) var new_name = rule.new_name; var index = 0; exec.forEach(function(v,i){ if(/(after)/.test(new_name)){ new_name = new_name.replace("(after)", Number(v)+1); } if(/(last)/.test(new_name)){ new_name = new_name.replace("(last)",signalCount); } new_name = new_name.replace("("+(i+1)+")", v); if(rule.tp && /\d+/.test(v)){ if(v==1){ new_name = "top" } index = v > index ? v : index } }) if(rule.tp){ res.push({orig_name:name, new_name:new_name, index:index}); }else{ res.push({orig_name:name, new_name:new_name}); } } else { res.push({orig_name:name, new_name:rule.new_name}); } } }) return res }, []) var tpIndex = {i: -1, value: 0}; res.forEach(function(v,i){ if(v.index && v.index > tpIndex.value){ tpIndex.i = i tpIndex.value = v.index } }) if(tpIndex.i >= 0){ res[tpIndex.i].new_name = "bottom" } return res } function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则} var job = props.job var matrix = GEN.getMatrix({job:job}); var matriName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row}) var matrixFirst = matriName[0]; // 记录matrix中第一位 var sortNames = []; var miscName = matriName.filter(function(name){ // 找出需要排序的名称列表 var flag = true; props.rule.forEach(function(item,i){ var evalReg = "/^"+item.name+"$/ig.test(name)"; if(name == item.name || eval(evalReg)){ flag = false; if(name === item.name){ var _item = JSON.parse(JSON.stringify(item)); _item.value = i; sortNames.push(_item); } else { var _item = JSON.parse(JSON.stringify(item)); _item.value = i; var str = "/^"+ item.name +"$/ig.exec(name)" _item.value2 = eval(str)[1] - 0; _item.name = name; sortNames.push(_item); } } }); return flag; }) miscName.forEach(function(n){ if(matrix[n].context == 'board'){ GEN.matrixLayerAttr({job:job,layer:n,context:'misc'}) } }) sortNames = sortNames.sort(function(a,b){ return a.value - b.value || a.value2 - b.value2 }) // 排序 if(sortNames.length){ if(sortNames[0].name !== matrixFirst) { // 如果第一位和matrix中第一位不同,先把第一位插入到最前面 GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst }) } sortNames.forEach(function(v,i,arr){ var layer = matrix[v.name]; if(i !== 0){ GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name }) } if(v.context !== layer.context || v.type !== layer.layer_type || v.polarity !== layer.polarity){ GEN.matrixLayerAttr({job:job,layer:v.name,context:v.context,type:v.type,polarity:v.polarity}); } }) } } function setDrill(){ // 设置钻孔 var martrix = GEN.getMatrix({job:job}); // 获取所有的钻孔层 var drillLayer = Object.keys(martrix).filter(function(v){ return martrix[v].layer_type == "drill" && martrix[v].context == "board" }) // 获取所有single层 var signalLayer = Object.keys(martrix).sort(function(a,b){return Number(martrix[a].row) - Number(martrix[b].row)}).filter(function(v){ return martrix[v].layer_type == "signal" && martrix[v].context == "board" }) var layerCount = GEN.getLayerCount({job:job}) // findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2 function findSignal(num){ var res = signalLayer.filter(function(v){ var vnum = 0; if(/\d/.test(v)){ var tmp = /(\d+)/ig.exec(v); vnum = tmp? Number(tmp[1]) : 0; } return num === vnum }) return res[0]; } function doDrill(drills){ // 分析钻孔层 return drills.map(function(v){ if(v == "drill"){ return {start:signalLayer[0], end:signalLayer[signalLayer.length - 1], layer:v} } else { var tmp = /(\d+).(\d+)/ig.exec(v); if(tmp){ var start = Number(tmp[1]) === 1? 'top':findSignal(Number(tmp[1])); var end = Number(tmp[2]) === layerCount? 'bottom': findSignal(Number(tmp[2])); return {start:start, end:end, layer:v} } else { return 0; } } }) } var drillSetList = doDrill(drillLayer); // 分析得到钻孔设置结果 drillSetList = drillSetList.filter(function(v){return v!==0}) drillSetList.forEach(function(v){ GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end}) }) }