排序设置钻孔脚本.js 5.24 KB
Newer Older
Scott Sun's avatar
Scott Sun committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

var $ = require('topcam.scriptfunc').argv();
var ikm = $.ikm;
var gen = $.gen;
var gui = $.gui;
var fs = require('fs');
var _ = require('lodash');
var Job = 'demo1', step = 'orig';
try {
    var sortRule = [  // 排序规则
        {name:'past_top',context:'board',type:'solder_paste',polarity:'positive'},
        {name:'silk_top',context:'board',type:'silk_screen',polarity:'positive'},
        {name:'sm_top',context:'board',type:'solder_mask',polarity:'positive'},
        {name:'top',context:'board',type:'signal',polarity:'positive'},
        {name:'layer_(\\d+)',context:'board',type:'signal',polarity:'positive'},
        {name:'bottom',context:'board',type:'signal',polarity:'positive'},
         {name:'sm_botm',context:'board',type:'solder_mask',polarity:'positive'},
         {name:'silk_bot',context:'board',type:'silk_screen',polarity:'positive'},
        {name:'past_botm',context:'board',type:'solder_paste',polarity:'positive'},
         {name:'array',context:'board',type:'drill',polarity:'positive'},
         {name:'l(\\d+)-\\d+',context:'board',type:'drill',polarity:'positive'},
         {name:'b(\\d+)-\\d+',context:'board',type:'drill',polarity:'positive'},
        {name:'outline',context:'board',type:'rout',polarity:'positive'},
        {name:'fab.art',context:'board',type:'rout',polarity:'positive'},
        {name:'top-enig',context:'board',type:'rout',polarity:'positive'},
        {name:'bot-enig',context:'board',type:'rout',polarity:'positive'},
        {name:'fab_page2',context:'board',type:'rout',polarity:'positive'}
    ];

    var matrix = gen.getMatrix({job:Job});
    var matriName = _.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){  // 找出需要排序的名称列表 过滤出不用排序的名称 将其属性设置为misc
        var flag = true;
        sortRule.forEach(function(item,i){
            var evalReg = "/^"+item.name+"$/ig.test(name)";
            if(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){
                // 判断是否需要排序
                if(layer.row-0 !== i+1){
                    gui.msg({name:v.name,row:layer.row,index:i,msg:"需要排序"})
                    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});
            }
        })
    }

    // 设置钻孔层的开始与结束
    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).filter(function(v){
        return martrix[v].layer_type == "signal" && martrix[v].context == "board"
    })
    var layerCount = gen.getLayerCount({job:Job})
    function findSignal(num){
        var res = signalLayer.filter(function(v){
            var vnum;
            if(/\d/.test(v)){
                vnum = /(\d+)/ig.exec(v)[1] - 0;
            }
            return num === vnum
        })
        return res[0];
    }
    function doDrill(drills){  // 分析钻孔层
        return drills.map(function(v){
            var tmp = /(\d+).(\d+)/ig.exec(v);
            var start = tmp[1] == 1? 'top':findSignal(tmp[1]-0); 
            var end = tmp[2] == layerCount? 'bottom': findSignal(tmp[2]-0);
            return {start:start, end:end, layer:v}
        })
    }
    var drillSetList = doDrill(drillLayer);   // 分析得到钻孔设置结果
    drillSetList.forEach(function(v){
        gen.matrixLayerDrill({job:Job,layer:v.layer,start:v.start ,end:v.end})
    })

    return 'done';
}
catch (error) {
    gui.msg(error);
    return 'error';
}