/* 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 database = require("topsin.database"); database.addConnection($.conf.database_conf, "DFM"); var QDfm = database.query("DFM"); if ($.conf.product_type == "aimdfm") { QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } }); } var GEN = $.gen; var Job = $.job_name; var db = $.db; var JobId = $.job_id; var Status = 'ok'; var resultData = []; var PAR = {}; if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); } try { var mode = "use" // develop 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 != "develop"){ 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 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]) 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] 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 // 拿到数据标准化配置 // 排序和设属性 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} 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] }) } } else if(chabie>1 && chabie < layer_count - 1){ // 改名 GEN.renameLayer({job:job,layer:v,new_name:v.substr(0,v.length-1)}) } } }) var all_layer = Object.keys(tmp_matrix) // 没有outline层 if(profileRule && all_layer.indexOf("outline") < 0){ // 判断有没有profile var board_layer = all_layer.filter(function(v){ return tmp_matrix[v].context == "board" }) 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 createOutline({job:job, step:tmp_step, matrix: tmp_matrix, profileRule:profileRule}) var hasProfile = GEN.getProfile({job:job, step:tmp_step}) if(hasProfile.match(/\n/ig).length == 1){ throw "创建profile失败" } } else { GEN.affectedLayer({affected:'yes',layer: board_layer, clear_before:"yes"}) GEN.selectByFilter({profile:"out"}) if(GEN.getSelectCount() > 0){ GEN.selDelete() } } } // end GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号 GEN.saveJob({ job: job }); GEN.checkInout({job:job,mode:"in"}) GEN.closeJob({job:job}) QDfm.updateRow({ table: "pdm_aimdfm_task", data: { progress: 33.33 }, 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 }; } } catch (e) { Status = 'error'; resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]}); return {status: Status, result_data: resultData}; } 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.tl_name == "drill" || v.tl_name=="rout" || v.tl_name=="outline"){ return {start:findSignal(1), end:findSignal(layerCount), layer:v.name} } 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; } } }) } 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} 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()}); }) } } GEN.affectedLayer({affected:"no",mode:"all"}); GEN.clearLayers(); 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 = props.matrix 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_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") GEN.selContourize() GEN.selectByFilter({feat_types:"surface"}) GEN.selReverse() if(GEN.getSelectCount()>0){GEN.selDelete()} var tmp_layer = l+"+++" GEN.selRefFeat({layers:drill_layer[0],use:'filter',mode:'touch'}) if(GEN.getSelectCount() > 0){ var tmp_outline2 = l + "_tmp" selCopyLayer({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}) GEN.renameLayer({job:job, layer:l,new_name:'outline'}) return true } GEN.deleteLayer({job:job, layer:tmp_layer}) return false } } 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}) }