ATS_AIM_layer_rename_v_2_0.js 11.5 KB
Newer Older
Scott Sun's avatar
s  
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
/*
    NAME: 
    DESCRIPTION: matrix改名和排序
    PARAMETER:
	[
		{
			name : 'customer',
			title : 'CUSTOMER 名',
			type : 'LineEdit',
			property : {tool_tip : '客户名称'}
        },
        {
            name : 'job_name',
			title : '料号名',
			type : 'LineEdit',
			property : {tool_tip : '料号名'}
        }
    ]

    VERSION_HISTORY:
	V1.00 2020 3-30 Scott
	
    HELP:
	<html><body bgcolor="#DDECFE">
		<font size="3" color="#003DB2"><p>功能简介</p></font>
		  <p> matrix改名和排序</p>
		  <br>
		<font size="3" color="#003DB2"><p>参数配置</p></font>
		 <p> matrix改名和排序规则 </p>
		<font size="3" color="#003DB2"><p>注意事项</p></font>
		  <p> ● 无 </p>
		  <br>
	</body></html>	
*/

// 引入模块 包
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 mode = "develop" // develop
	var config = require("../config.js")   // 读取配置文件
	var par = {    // todo
Scott Sun's avatar
s  
Scott Sun committed
49
		job:"i4",
Scott Sun's avatar
s  
Scott Sun committed
50 51
		customer: "Customer_2"
	}
Scott Sun's avatar
s  
Scott Sun committed
52 53 54
	var job = par.job || Job;
    if(_.isEmpty(job)) throw "没有传入料号名!";
	job = job.toLowerCase()
Scott Sun's avatar
s  
Scott Sun committed
55 56 57 58 59 60
	var custCfg = config.customer[par.customer]	// 获取客户配置
	var step = custCfg.step.toLowerCase()	// 获取pcs_step
	// 料号验证
    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 && mode != "develop"){ throw "the job check" }
Scott Sun's avatar
s  
Scott Sun committed
61 62 63 64 65
	GEN.checkInout({job:job,mode:"out"});

	// if(config.hasOwnProperty("merge_drill")){ // todo
	// 	mergeDrill({job:job})
	// }
Scott Sun's avatar
s  
Scott Sun committed
66 67 68
	// start    martix_tl_name
	var matrix = GEN.getMatrix({job:job})
	var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name})   // 给matrix信息添加tl_name
Scott Sun's avatar
s  
Scott Sun committed
69 70 71 72 73 74 75



	tl_name_matrix.forEach(function(item){  // * 调试
		IKM.add({name:item.name, tl_name:item.tl_name})
	})
	IKM.add("",1)
Scott Sun's avatar
s  
Scott Sun committed
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

	var format_cfg = config.data_format   // 拿到数据标准化配置

	// 排序和设属性
	var ret = sortLayer({job:job, rule:format_cfg, matrix:tl_name_matrix})
	if(ret.err){throw err}
	var after_sort_matrix = ret.sortNames
	// 设置钻孔
	err = setDrill({job:job, matrix:after_sort_matrix})
	if(err){throw err}
	
	// 改名
	err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
	if(err){throw err}

    return 'Done';
}
catch (error) {
    GUI.msg(error);
    return 'Error';
}

function tlNameMatrix(props){  // 设置标准名
	var matrix = props.matrix
	var tlname_rules = []
	props.tl_name.forEach(function(item){
		if(typeof item.orig_name == "string"){
			tlname_rules.push(item)
		} else {
			item.orig_name.forEach(function(name2){
				tlname_rules.push({
					orig_name: name2,
					tl_name: item.tl_name
				})
			})
		}
	})
Scott Sun's avatar
s  
Scott Sun committed
113
	var res = Object.keys(matrix).map(function(key){  // 将matrix信息添加tl_name 如果没有tl_name 就返回原信息
Scott Sun's avatar
s  
Scott Sun committed
114
		var val = matrix[key]
Scott Sun's avatar
s  
Scott Sun committed
115
		if(val.hasOwnProperty("tl_name")){delete val.tl_name}
Scott Sun's avatar
s  
Scott Sun committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
		var tlRule = tlname_rules.filter(function(rule){
			if(rule.orig_name === key){return true}
			var reg = new RegExp(rule.orig_name,"ig")
			return reg.test(key)
		})
		if(tlRule.length == 0){return val}
		for(var i=0;i<tlRule.length;i++){
			if(tlRule[i].orig_name === key){return _.assign(val,{tl_name:tlRule[0].tl_name})}
		}
		var reg = new RegExp(tlRule[0].orig_name,"ig")
		var tmp = reg.exec(key)
		if(tmp && tmp.length){
			var replaceArr = tmp.slice(1)
			var tl_name = tlRule[0].tl_name
			var params = {}
			for(var i = 0; i<replaceArr.length;i++){
				params["$"+(i+1)] = replaceArr[i]
			}
			replaceArr.forEach(function(v,i){
				tl_name = tl_name.replace("($"+(i+1)+")",v)
			})
			tl_name = replaceTlName(tl_name)
			function replaceTlName(name){
				var tmp = /(\([^)]*\))/ig.exec(name)
				if(!tmp){ return name }
				var param_arr = tmp[1].match(/\$\d+/ig)
				var newname = tmp[1]
				param_arr.forEach(function(v){
					newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
				})
				newname = name.replace(tmp[1],eval(newname))
				return replaceTlName(newname)
			}
			return _.assign(val,{tl_name:tl_name})
		}else {
			return _.assign(val,{tl_name:tlRule[0].tl_name})
		}
	})
	return res
}

function sortLayer(props){  // 排序方法  {job:要排序的料号, rule: {要改名的规则}
    var job = props.job
	var matrix =  GEN.getMatrix({job:job})
	var tl_matrix = props.matrix
	var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
    var matrixFirst = matrixName[0];  // 记录matrix中第一位
	var sortNames = [];
    var miscName = tl_matrix.filter(function(value){  // 找出需要排序的名称列表
		var flag = true;
		if (!value.tl_name || value.tl_name == ""){return true}
		var tl_name = value.tl_name
        props.rule.forEach(function(item,i){
            var evalReg = "/"+item.tl_name+"/ig.test(tl_name)";
            if(tl_name == item.tl_name || eval(evalReg)){
                flag = false;
                if(tl_name === item.tl_name){
                    var _item = JSON.parse(JSON.stringify(item));
					_item.value = i;
					_item.name = value.name
					_item.rule = item.tl_name
                    sortNames.push(_item);
                } else {
                    var _item = JSON.parse(JSON.stringify(item));
                    _item.value = i;
					var str = "/"+ item.tl_name +"/ig.exec(tl_name)"
					_item.value2 = eval(str).pop() - 0;
					_item.name = value.name
					_item.rule = item.tl_name
                    _item.tl_name = tl_name;
                    sortNames.push(_item);
                }
            }
        });
        return flag;
	}).map(function(v){return v.name})
    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){
            if(i !== 0){
                GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })             
            }
            GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
        })
	}
	return {
		sortNames:sortNames
	}
}

function setDrill(props){   // 设置钻孔
    var job = props.job
	var matrix = props.matrix
Scott Sun's avatar
s  
Scott Sun committed
220
	
Scott Sun's avatar
s  
Scott Sun committed
221 222
    // 获取所有的钻孔层
    var drillLayer =matrix.filter(function(v){
Scott Sun's avatar
s  
Scott Sun committed
223
        return (v.attr.type == "drill" || v.attr.type == "rout") && v.attr.context == "board"
Scott Sun's avatar
s  
Scott Sun committed
224 225 226 227 228 229 230 231 232
    })
    // 获取所有single层
    var signalLayer =matrix.filter(function(v){
        return v.attr.type == "signal" && v.attr.context == "board"
	})
	var layerCount = GEN.getLayerCount({job:job})
    // findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2 
    function findSignal(num){
        return signalLayer[Number(num-1)].name
Scott Sun's avatar
s  
Scott Sun committed
233
	}
Scott Sun's avatar
s  
Scott Sun committed
234 235
    function doDrill(drills){  // 分析钻孔层
        return drills.map(function(v){
Scott Sun's avatar
s  
Scott Sun committed
236 237
            if(v.name == "drill" || v.name=="rout"){
                return {start:findSignal(1), end:findSignal(layerCount), layer:v.name}
Scott Sun's avatar
s  
Scott Sun committed
238 239 240 241 242 243 244 245 246 247 248 249
            } else {
                var tmp = /(\d+)-(\d+)/ig.exec(v.tl_name);
                if(tmp){
                    var start = findSignal(tmp[1]); 
                    var end = findSignal(tmp[2]); 
                    return {start:start, end:end, layer:v.name}
                } else {
                    return 0;
                }
            }
        })
    }
Scott Sun's avatar
s  
Scott Sun committed
250
	var drillSetList = doDrill(drillLayer);   // 分析得到钻孔设置结果
Scott Sun's avatar
s  
Scott Sun committed
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
	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})
    })
}

function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
    var job = props.job
	var matrix = props.matrix
	var cfg = props.cfg
	matrix = matrix.filter(function(v){return v.name != v.new_name})
	var rename_list = matrix.map(function(item){
		var new_name;
		var tl_name = item.tl_name
		var rule = item.rule
		if(rule === tl_name){
			new_name = item.new_name
		} else {
			var reg = new RegExp(rule,"ig")
			var tmp = reg.exec(tl_name)
			if(!tmp){return undefined}
			var replaceArr = tmp.slice(1)
			new_name = item.new_name
			var params = {}
			for(var i = 0; i<replaceArr.length;i++){
				params["$"+(i+1)] = replaceArr[i]
			}
			replaceArr.forEach(function(v,i){
				tl_name = tl_name.replace("($"+(i+1)+")",v)
			})
			new_name = replaceTlName(new_name)
			function replaceTlName(name){
				var tmp = /(\([^)]*\))/ig.exec(name)
				if(!tmp){ return name }
				var param_arr = tmp[1].match(/\$\d+/ig)
				var newname = tmp[1]
				param_arr.forEach(function(v){
					newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
				})
				newname = name.replace(tmp[1],eval(newname))
				return replaceTlName(newname)
			}
		}
		return {
			orig_name: item.name,
			new_name: new_name
		}
	})
	rename_list = rename_list.filter(function(v){
		var flag = true
		if(!v){flag = false}
		if(!v.orig_name || !v.new_name ){flag = false}
		return flag
	})
	rename_list.forEach(function(v){
        if(v.orig_name !== v.new_name){
            GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name})
        }
    });
}

function mergeDrill(props){ // 合并钻孔
    var newdrills = []
    var job = props.job;
    var step = GEN.getStepList({job:job})[0];
    var maxDrill = {name:"",value:0};
    function getDrl(str){
Scott Sun's avatar
s  
Scott Sun committed
318
        var num = /(\d+)-(\d+)\.drl/ig.exec(str);  // 匹配出 num-num
Scott Sun's avatar
s  
Scott Sun committed
319 320 321 322 323 324 325 326 327 328 329 330 331
        var tmp = [];
        for(var i = Number(num[1]);i<num[2];i++){
            if(i == 1){
                maxDrill = Number(num[2]) >  maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
            }
            tmp.push("L"+i+"-"+(i+1));
        }
        return tmp;
    } 
    var matrix = GEN.getMatrix({job:job});
    GEN.openStep({job : job,name:step});
    for(var key in matrix){
        var val = matrix[key];
Scott Sun's avatar
s  
Scott Sun committed
332
        if(val.layer_type == "drill" && /(\d+)-(\d+)\.drl/ig.test(val.name)){
Scott Sun's avatar
s  
Scott Sun committed
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
            var mergeTo = getDrl(val.name) // 要合并到的地方
            mergeTo.forEach(function(layerName){
                if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
                    GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
                }
                if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){
                    GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
                    newdrills.push(layerName.toLowerCase())
                }
                GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
                GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
            })
        }
    }
    GEN.createLayer({job:job,layer:"b1-"+maxDrill.value,conext:'board',type:'drill'});
    GEN.workLayer({name:"b1-"+maxDrill.value,display_number:1,clear_before:'yes'});
    GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"b1-"+maxDrill.value});
Scott Sun's avatar
s  
Scott Sun committed
350 351
	GEN.affectedLayer({affected:"no",mode:"all"});
	GEN.clearLayers();
Scott Sun's avatar
s  
Scott Sun committed
352 353
    GEN.closeStep();
}