/* 第一步. 逻辑检查,初始化,选取出需要测的steplist 第二步. 将要测net的step对应关系整理好 将array array_c copy到 _tmp 删除排版 打散关系 array_net 删除排版 打散关系 第三步. doNet 里所有step pgn极性翻转 第四步. doNet.orig foNet.net 对比测net end: 删除辅助层 临时step */ var $ = require('topcam.scriptfunc').argv(); var _ = require('lodash'); var JOB = $.job_name; var GEN = $.gen; var ikm = $.ikm; // var plugin = require('topsin.gengui'); // var gui = plugin.newGui(); // var r = gui.msgBox("mo", "info", "are you ok?", ["ok", "cancel"]); try { console.log("===================start================="); // 第一步. 逻辑检查,初始化,选取出需要测的steplist if (!JOB) { throw '没有传入料号名!' } // 判断传没传入JOB if (!GEN.isJobExists({ job: JOB })) { throw '料号' + JOB + '在genesis中不存在' } // 判断genesis中是否存在料号 if (!GEN.isJobOpen({ job: JOB })) { GEN.openJob({ job: JOB }) } // 如果料号没打开 先打开料号 GEN.checkInout({ job: JOB, mode: 'out' }) // 锁住料号权限 var matrix = _.values(GEN.getMatrix({ job: JOB })) // 获取matrix信息 转化为数组 var tmp_matrix = matrix.filter(function(item){ // 返回非misc的matrix if(item.context === 'board' && !(/^(signal|drill)$/ig.test(item.layer_type))){ item.context = 'misc' GEN.matrixLayerAttr({job:JOB,layer:item.name,context:'misc'}) } return item.context === 'board' }) var stepList = GEN.getStepList({ job: JOB }).filter(function (item) { // 获取需要测的step列表 var reg = /^(pcb_c|pcb\d*|array|array_c)$/ig // pcb/pcb_c,pcb1,2,3… ; array/array_c return reg.test(item) }) GEN.PAUSE(JSON.stringify({ msg:1, stepList: stepList })) // 第二步. 将要测net的step对应关系整理好 将array array_c copy到 _tmp 删除排版 打散关系 array_net 删除排版 打散关系 var doNet = {orig:[],net:[]} var copyArray = [] // 记录临时的tmp 最后删除 stepList.forEach(function(step){ if(/^(array|array_c)$/ig.test(step)){ doArray(step) // 处理array类的step step = step + "_tmp" } doNet.orig.push(step) doNet.net.push(origToNet(step)) }) doArray('array_net') GEN.PAUSE(JSON.stringify({ msg:2, doNet: doNet })) // 第三步. doNet 里所有step pgn极性翻转 var negativeLayer = [] // 记录pgn开头的层 之后删除里面的newname tmp_matrix.forEach(function(layer){ if(/^pgn/.test(layer.name)){ // 找负片层 var newName = layer.name + '_tmp' negativeLayer.push({name:layer.name,newName:newName}) if(GEN.isLayerExists({job:JOB,layer:newName})){ GEN.deleteLayer({job:JOB,layer:newName})} // 创建一个层 GEN.openStep({job:JOB,name:'orig'}) GEN.createLayer({job:JOB,layer:newName,context:'board',type:layer.layer_type,after:layer.name}) GEN.closeStep() // 将原来的层设置为misc GEN.matrixLayerAttr({job:JOB,layer:layer.name,context:'misc'}) } }) var doNet_tmp = toArr(doNet) // 将doNet数组化并去重 doNet_tmp.forEach(function(step){ negativeLayer.forEach(function(layer){ GEN.openStep({ job: JOB, step: step }) // 给新创建的层铺满铜皮 GEN.workLayer({name:layer.newName,display_number:1,clear_before:'yes'}) GEN.srFill({layer:layer.newName}) // 将旧的copy过去 翻转一下 GEN.copyLayer({source_job:JOB,mode:'append',source_step:step,source_layer:layer.name,dest_layer:layer.newName,invert:'yes'}) GEN.closeStep(); }) }) GEN.PAUSE(JSON.stringify({ msg:3, doNet_tmp: doNet_tmp })) // 第四步. doNet.orig foNet.net 对比测net for (var i = 0; i < doNet['orig'].length; i++) { var v1 = doNet['orig'][i] var v2 = doNet['net'][i] GEN.netlistPageOpen() // 打开netlist窗口 GEN.netlistRecalc({job:JOB,step:v1,type:'cur',display:'top'}) // 计算netlist数据 GEN.netlistRecalc({job:JOB,step:v2,type:'cur',display:'bottom'}) // 计算netlist数据 // compare var netlistCompare = GEN.netlistCompare({ job1:JOB,step1:v1,type1:'cur', job2:JOB,step2:v2,type2:'cur' }); if(netlistCompare.shorted > 0 || netlistCompare.broken > 0){ GEN.PAUSE(JSON.stringify({shorted:netlistCompare.shorted,broken:netlistCompare.broken})) } GEN.netlistPageClose() // 关闭netlist窗口 } GEN.PAUSE(JSON.stringify({ msg:4 })) // end: 删除辅助层 临时step _.forEach(negativeLayer,function(item){ GEN.PAUSE('delLayer:'+item.newName) GEN.deleteLayer({job:JOB,layer:item.newName}) }) _.forEach(copyArray,function(step){ GEN.PAUSE('del:'+step) GEN.deleteStep({job:JOB,step:step}) }) GEN.saveJob({job:JOB}) GEN.checkInout({job: JOB,mode:'in'}); // 解锁 return 'Done'; } catch (error) { error = error || 'error' return error } function doArray(step){ if(GEN.isStepExists({job:JOB,step:step+'_tmp'})) { GEN.deleteStep({job:JOB,step:step+'_tmp'}) } // 如果tmp的step已经存在 则删除 GEN.matrixCopyStep({job:JOB,step:step,new_name:step+'_tmp'}) // copy一个层 step = step+'_tmp' copyArray.push(step) GEN.openStep({ job: JOB, step: step }); GEN.affectedLayer({ mode: 'all', affected: 'yes', layer: tmp_matrix.map(function(v){return v.name})}); GEN.COM('sredit_sel_steps_name,name=coupon') GEN.COM('sredit_del_steps') GEN.COM('sredit_reduce_nesting,mode=one_highest') // 打散 GEN.clearLayers(); // 清除显示 GEN.affectedLayer({ mode: 'all', affected: 'no' }); // 清除影响层 GEN.closeStep(); } function origToNet(orig){ if (/^pcb\d+$/ig.test(orig)) { // 1,2,3 net1,2,3 return orig.replace(/pcb/ig, 'net') } else if (/^pcb[^\d]*$/ig.test(orig)) { // pcb pcb_c net return 'net' } else if (/^array/ig.test(orig)) { // array array_c array_net return 'array_net_tmp' } } function toArr(doNet){ var arr = [] arr = _.concat(doNet.orig,doNet.net) return unique(arr) } function unique(arr){ //数组去重 for(var i=0; i