/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'config_path',
title : '配置地址',
type : 'LineEdit',
property : {tool_tip : '配置的路径'},
}
]
VERSION_HISTORY:
V1.00 2020-04-17 Scott Sun
1.新版本
HELP:
功能简介
数据标准化
参数配置
客户配置
注意事项
无
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// 引入模块 包
console.log("==============================================>data_format")
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) {
PAR = $.par
} else if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title
},
where: { id: $.task_id }
});
}
}
var Status = 'ok';
var resultData = [];
try {
script_info({ result_severity: "format start" })
script_info({ progress: 35 })
var par = PAR;
if(!par.hasOwnProperty("config_path") || par.config_path==""){
console.log("==============cfg");
par.config_path = "cam/input_data"
};
var db_customer = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field:'customer_code',
where:{id : JobId}
})
});
if(_.isEmpty(db_customer)){throw "customer error"}
if(db_customer && !(/^done$/ig.test(db_customer)) && db_customer != "" ){
par.customer = db_customer
}
par.customer = par.customer[0].toUpperCase()+par.customer.slice(1).toLowerCase()
var cfg = db.query("",function(q){
return q.selectValue({
table:'pub_conf',
field:'text_data',
where:{path : par.config_path}
})
});
if (!cfg || cfg == ""){throw "cfg can not find"}
var config = eval(cfg)
var job = Job;
if(_.isEmpty(job)) throw "没有传入料号名!";
job = job.toLowerCase()
var custCfg = config.customer[par.customer] // 获取客户配置
if(!custCfg){throw "config error"}
// 料号验证
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 == "aimdfm"){ throw "the job check" }
console.log("Checkout====== ========================>")
GEN.checkInout({job:job,mode:"out"});
console.log("Checkout success==============================>")
var profileRule = []
if(custCfg.hasOwnProperty("mergerule")){
var mergeRule = custCfg.mergerule
if(mergeRule.drill){
if (mergeRule.drill_second){
var matrix = GEN.getMatrix({job:job})
var layers = Object.keys(matrix)
var is_second = false
layers.forEach(function(layer){
mergeRule.drill.forEach(function(item){
var reg = new RegExp(item.orig_rule,"ig")
if(reg.test(layer)){is_second = true}
})
})
if(!is_second){
mergeRule.drill = mergeRule.drill_second
}
}
if(/string/ig.test(typeof(mergeRule.drill[0]))){ // drill层 计算
var drill_layers = [];
var tmp_layers = [];
var matrix = GEN.getMatrix({job:job})
// 计算最大值
var layers = Object.keys(matrix)
var maxnum = []
layers.forEach(function(v){
var hasrule
mergeRule.drill.forEach(function(rule){
var reg = new RegExp(rule,"ig")
if(reg.test(v)){hasrule = rule}
})
if(hasrule){
var reg = new RegExp(hasrule,"ig")
var tmp = reg.exec(v)
var num1 = Number(tmp[1])
var num2 = Number(tmp[2])
tmp_layers.push({num1:num1,num2:num2,layer:v})
if(num1==1){
drill_layers.push({num1:num1,num2:num2,layer:v})
}
maxnum.push(num1)
maxnum.push(num2)
}
})
var max = maxnum.sort(function(a,b){return b-a})[0]
if (drill_layers.length > 0 && String(drill_layers[0].num2) == "NaN") {
var maxLayer = tmp_layers.filter(function(v) {return v.num1 == max})
GEN.COM("matrix_rename_layer",{job:job,matrix:"matrix",layer:maxLayer[0].layer,new_name:"drill"})
}
var drill_layer = drill_layers.filter(function(v){return v.num2 == max})
if(drill_layer.length){
drill_layer = drill_layer[0].layer
GEN.COM("matrix_rename_layer",{job:job,matrix:"matrix",layer:drill_layer,new_name:"drill"})
}
}else if(/object/ig.test(typeof(mergeRule.drill[0]))){
var matrix = GEN.getMatrix({job:job})
// 计算最大值
var layers = Object.keys(matrix)
var tmp_step = GEN.getStepList({job:job})
GEN.openStep({job:job,name:tmp_step[0]})
layers.forEach(function(layer){
var tmp = mergeRule.drill.filter(function(item){
var reg = new RegExp(item.orig_rule,"ig")
return reg.test(layer)
})
if(tmp.length){
tmp = tmp[0]
GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
if(tmp.drill_type){
GEN.COM("cur_atr_set,attribute=.drill,option="+tmp.drill_type)
GEN.COM("sel_change_atr,mode=add")
}
GEN.selCopyOther({dest:'layer_name',target_layer:'drill',invert:'no',dx:0,dy:0,size:0})
GEN.workLayer({name:"drill",display_number:2,clear_before:'yes'})
GEN.COM("chklist_single,action=valor_dfm_nfpr,show=yes")
GEN.COM("chklist_cupd,chklist=valor_dfm_nfpr,nact=1,params=((pp_layer=.affected)(pp_delete=Duplicate)(pp_work=Features)(pp_drill=PTH\;NPTH\;Via\;PTH - Pressfit\;Via - Laser\;Via - Photo)(pp_non_drilled=Yes)(pp_in_selected=All)(pp_remove_mark=Remove)),mode=regular")
GEN.COM("chklist_run,chklist=valor_dfm_nfpr,nact=1,area=global")
GEN.deleteLayer({job:job,layer:["drill+++"]})
}
})
GEN.closeStep()
}
}
if(mergeRule.laser){
var newdrills = mergeLaser({job:job, mergeRule:mergeRule.laser})
var tmp_step = GEN.getStepList({job:job})
GEN.openStep({job:job,name:tmp_step[0]})
newdrills.forEach(function(v){
GEN.workLayer({name:v,display_number:2,clear_before:'yes'})
GEN.COM("chklist_single,action=valor_dfm_nfpr,show=yes")
GEN.COM("chklist_cupd,chklist=valor_dfm_nfpr,nact=1,params=((pp_layer=.affected)(pp_delete=Duplicate)(pp_work=Features)(pp_drill=PTH\;NPTH\;Via\;PTH - Pressfit\;Via - Laser\;Via - Photo)(pp_non_drilled=Yes)(pp_in_selected=All)(pp_remove_mark=Remove)),mode=regular")
GEN.COM("chklist_run,chklist=valor_dfm_nfpr,nact=1,area=global")
GEN.deleteLayer({job:job,layer:["drill+++"]})
})
GEN.deleteLayer({job:job,layer:newdrills.map(function(v){return v + "+++"})})
GEN.closeStep()
}
if(mergeRule.profile){
profileRule = mergeRule.profile
}
}
// start martix_tl_name
console.log("get matrix ====== ======== job:" + job);
var matrix = GEN.getMatrix({job:job});
console.log("=========matrix:" + _.toString(matrix));
console.log("matrix add tl_name :");
var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name}) // 给matrix信息添加tl_name
console.log("tl_name add end:");
var format_cfg = config.data_format // 拿到数据标准化配置
// 排序和设属性
script_info({ result_severity: "format sort" })
script_info({ progress: 40 })
var ret = sortLayer({job:job, rule:format_cfg, matrix:tl_name_matrix})
if(ret.err){throw err}
var after_sort_matrix = ret.sortNames
// 改名
script_info({ result_severity: "format rename" })
script_info({ progress: 50 })
err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
if(err){throw err}
// 处理 yu cca ftdrillx-x-np
var tmp_step = GEN.getStepList({job:job})
GEN.openStep({job:job,name:tmp_step[0]})
var layers = Object.keys(GEN.getMatrix({job:job}))
layers.forEach(function(layer) {
if(/^ftdrill(\d+)-(\d+)-np$/ig.test(layer)) {
var $1 = RegExp.$1;
var $2 = RegExp.$2;
// 1. 将此层改为npth属性
// 2. 将此层合并到 ftdrill(\d+)-(\d+)l(如果有)
GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
GEN.COM("cur_atr_reset")
GEN.COM("cur_atr_set,attribute=.drill,option=non_plated")
GEN.COM("sel_change_atr,mode=add")
GEN.COM("cur_atr_reset")
var target = "ftdrill"+$1+"-"+$2+"l";
if(GEN.isLayerExists({job:job, layer:target})) {
GEN.copyLayer({source_job:job,source_step:tmp_step[0],source_layer:layer,dest_layer:target,mode:"append"})
GEN.deleteLayer({job:job,layer:[layer]})
} else {
GEN.renameLayer({job:job,layer:layer,new_name:target})
}
}
})
GEN.closeStep()
var tmp_matrix = GEN.getMatrix({job:job})
// 钻孔名称再次更改
var ftdrill_layer = Object.keys(tmp_matrix).filter(function(v){
return tmp_matrix[v].layer_type=="drill" && tmp_matrix[v].context=="board"
})
var hasMainDrill = Boolean(ftdrill_layer.indexOf("ftdrill") >= 0)
var layer_count = GEN.getLayerCount({job:job})
ftdrill_layer.forEach(function(v){
if(/(\d+)-(\d+)/.test(v)){
var tmp = /(\d+)-(\d+)/.exec(v)
var num1 = Number(tmp[1])
var num2 = Number(tmp[2])
var chabie = num2 - num1
if(num1 == 1 && num2 == layer_count && !hasMainDrill){
GEN.renameLayer({job:job,layer:v,new_name:"ftdrill"})
if (ftdrill_layer[ftdrill_layer.length-1]!= v){
GEN.matrixMoveRow({ job:job,layer:"ftdrill",after:ftdrill_layer[ftdrill_layer.length-1] })
}
hasMainDrill = !hasMainDrill
} else if(chabie>1 && chabie < layer_count - 1){
// 改名
GEN.renameLayer({job:job,layer:v,new_name:v.substr(0,v.length-1)})
}
}
})
// 设置钻孔
err = setDrill({job:job})
if(err){throw err}
script_info({ result_severity: "format create profile" })
script_info({ progress: 55 })
var all_layer = Object.keys(tmp_matrix)
// 没有outline层
if(all_layer.indexOf("outline") >= 0) { profileRule.unshift("outline")}
if(profileRule){
// 判断有没有profile
var tmp_step = GEN.getStepList({job:job})[0]
GEN.openStep({job:job, name:tmp_step})
var now_profile = GEN.getProfile({job:job, step:tmp_step})
if(now_profile.match(/\n/ig).length == 1){ // 如果没有profile
if(profileRule[0] == "outline") {
GEN.workLayer({name:'outline',display_number:2,clear_before:'yes'})
GEN.selAllFeat()
if(GEN.getSelectCount() > 0) {
GEN.selCreateProfile()
}
var hasProfile = GEN.getProfile({job:job, step:tmp_step})
GEN.closeStep()
if(hasProfile.match(/\n/ig).length == 1){
createOutline({job:job, step:tmp_step, profileRule:profileRule})
}
} else {
createOutline({job:job, step:tmp_step, profileRule:profileRule})
}
var hasProfile = GEN.getProfile({job:job, step:tmp_step})
if(hasProfile.match(/\n/ig).length == 1){
script_info({ result_severity: "创建profile失败" })
throw "创建profile失败"
}
}
}
console.log("_______format_end_________wait_for_save:");
// end
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
result_severity: "format ok",
progress: 60
},
where: { id: $.task_id }
});
if (GEN.hasError()) {
Status = 'error';
resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {
status: Status,
result_data: resultData
};
} else {
resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
return {
status: Status,
result_data: resultData
};
}
}else {
return "Done"
}
}
catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"))
IKM.msg(e)
Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "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
})
})
}
})
var res = Object.keys(matrix).map(function(key){ // 将matrix信息添加tl_name 如果没有tl_name 就返回原信息
var val = matrix[key]
if(val.hasOwnProperty("tl_name")){delete val.tl_name}
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;isetdrill:drillLayer:" + _.toString(drillLayer));
console.log("=================>setdrill:signalLayer:" + _.toString(signalLayer));
var layerCount = GEN.getLayerCount({job:job})
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
function findSignal(num){
console.log(num)
return signalLayer[Number(num-1)].name
}
function doDrill(drills){ // 分析钻孔层
return drills.map(function(v){
if(v.name == "ftdrill" || v.name=="rout" || v.name=="outline"){
return {start:findSignal(1), end:findSignal(layerCount), layer:v.name}
} else {
var tmp = /(\d+)-(\d+)/ig.exec(v.name);
if(tmp){
var start = findSignal(tmp[1]);
var end = findSignal(tmp[2]);
return {start:start, end:end, layer:v.name}
} 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})
})
}
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}
// ["1","10","np"]
var replaceArr = tmp.slice(1)
new_name = item.new_name
var params = {}
for(var i = 0; i maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
}
var layername = mergeTlname.replace("($1)", i)
layername = layername.replace("($2)", i+1)
tmp.push(layername);
}
return tmp;
}
var matrix = GEN.getMatrix({job:job});
GEN.openStep({job : job,name:step});
for(var key in matrix){
var val = matrix[key];
var tmpregs = regs.filter(function(v){
var reg = new RegExp(v,"ig")
return reg.test(val.name)
})
if(tmpregs.length > 0){
var reg = tmpregs[0]
var mergeTo = getDrl(val.name, reg) // 要合并到的地方
merge_info[val.name] = mergeTo
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()});
if(/drl|drill/ig.test(val.name) && tmp.indexOf(val.name) < 0) {
tmp.push(val.name)
}
})
}
}
GEN.affectedLayer({affected:"no",mode:"all"});
GEN.clearLayers();
tmp.forEach(function(layer) {
GEN.COM("matrix_rename_layer,job="+job+",matrix=matrix,layer="+layer+",new_name="+layer.replace(/drl|drill/, "merage"))
})
GEN.closeStep();
return newdrills
}
function createOutline(props){
var profileRule = props.profileRule
console.log("----profileRule------->:" + _.toString(profileRule));
var job = props.job
var step = props.step
var matrix = GEN.getMatrix({job:job})
var outlines = Object.keys(matrix).filter(function(v){
var flag = false
profileRule.forEach(function(rule){
var reg = new RegExp(rule,"ig")
if(reg.test(v)){
flag = true
}
})
return flag
})
console.log("---- outlines------->:" + _.toString(outlines));
var drill_layer = Object.keys(matrix).filter(function(v){return matrix[v].layer_type=="drill" && matrix[v].context == "board"})
var tmp = "drill_all";
if(GEN.isLayerExists({job:job, layer:tmp})) { GEN.deleteLayer({job:job, layer:tmp})}
GEN.openStep({job:job, name:step})
GEN.affectedLayer({affected:'yes',layer:drill_layer})
GEN.selCopyOther({dest:'layer_name',target_layer:tmp,invert:'no',dx:0,dy:0,size:0})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.closeStep()
var tmp_outline
if(outlines.length){
if( outlines.length){
for(var i =0;i0){GEN.selDelete()}
GEN.selClearFeature()
GEN.COM("sel_cut_data,det_tol=1,con_tol=1,rad_tol=0.1,filter_overlaps=no,delete_doubles=no,use_order=yes,ignore_width=yes,ignore_holes=none,start_positive=yes,polarity_of_touching=same")
if(/1352/ig.test(PAR.customer) ){
GEN.COM("sel_polarity,polarity=positive")
}
GEN.selectByFilter({feat_types:"surface"})
GEN.selReverse()
if(GEN.getSelectCount()>0){GEN.selDelete()}
GEN.selContourize()
if(!/1352/ig.test(PAR.customer) ){
GEN.selectByFilter({feat_types:"surface"})
GEN.selReverse()
if(GEN.getSelectCount()>0){GEN.selDelete()}
}
var tmp_layer = l+"+++"
GEN.selRefFeat({layers:tmp,use:'filter',mode:'touch'})
if(GEN.getSelectCount() > 0){
var tmp_outline2 = l + "_tmp"
selCopyLayer({job:job,layer:tmp_outline2})
if(/1352/ig.test(PAR.customer) ){
// 1. worklayer bk2 删除非线 递归touch tmp_outline2
GEN.workLayer({name:bk2,display_number:2,clear_before:"yes"})
GEN.selectByFilter({feat_types:"pad;surface;text"})
if(GEN.getSelectCount() > 0) {GEN.selDelete()}
touch(tmp_outline2)
// 2. worklayer tmp_outline2 cuttingdata selContourize
GEN.workLayer({name:tmp_outline2,display_number:2,clear_before:"yes"})
GEN.COM("sel_cut_data,det_tol=1,con_tol=1,rad_tol=0.1,filter_overlaps=no,delete_doubles=no,use_order=yes,ignore_width=yes,ignore_holes=none,start_positive=yes,polarity_of_touching=same")
GEN.selContourize()
GEN.deleteLayer({job:job, layer:bk2})
GEN.deleteLayer({job:job, layer:tmp_outline2 + "+++"})
}
GEN.workLayer({name:l,display_number:2,clear_before:"yes"})
GEN.selAllFeat()
GEN.selDelete()
GEN.workLayer({name:tmp_outline2,display_number:2,clear_before:"yes"})
GEN.COM("sel_clean_holes,max_size=200,clean_mode=x_and_y")
GEN.COM("sel_surf2outline,width=1")
GEN.selAllFeat()
selCopyLayer({job:job,layer:l})
GEN.workLayer({name:l,display_number:2,clear_before:"yes"})
GEN.selClearFeature()
GEN.selCreateProfile()
GEN.selectByFilter({profile:"in"})
if(GEN.getSelectCount()> 0){GEN.selDelete()}
GEN.deleteLayer({job:job, layer:tmp_layer})
GEN.deleteLayer({job:job, layer:tmp_outline2})
if(GEN.isLayerExists({job:job,layer:"outline"})){GEN.deleteLayer({job:job,layer:"outline"})}
GEN.renameLayer({job:job, layer:l,new_name:'outline'})
GEN.deleteLayer({job:job, layer:l})
return true
}
GEN.deleteLayer({job:job, layer:l})
GEN.deleteLayer({job:job, layer:bk2})
GEN.deleteLayer({job:job, layer:[tmp_layer]})
GEN.deleteLayer({job:job, layer:[tmp_layer]})
return false
}
GEN.deleteLayer({job:job, layer:[tmp]})
}
function touch(layer) {
GEN.selRefFeat({layers:layer,use:"filter",mode:"touch"})
if(GEN.getSelectCount() > 0) {
GEN.selMoveOther({target_layer:layer,invert:'no',dx:0,dy:0,size:0})
touch(layer)
}
}
function selCopyLayer(props){ // 拷贝选择的到辅助层
var layer = props.layer
var job = props.job
if(GEN.isLayerExists({job:job,layer:layer})){
GEN.deleteLayer({job:job,layer:layer})
}
GEN.selCopyOther({dest:'layer_name',target_layer:layer})
}
function script_info(props){ // result_severity progress
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
data: props,
where: { id: $.task_id }
});
}
}