/* NAME: DESCRIPTION: ; PARAMETER: [ { name : 'max_via_size', title : '最大via孔径', type : 'LineEdit', property : {tool_tip : '最大via孔径,默认是0.9mm'}, }, { name : 'min_via_num', title : '最少via孔数', type : 'LineEdit', property : {tool_tip : '最少via孔数,默认是100'}, }, { name : 'equidistant_tolerance', title : '等间距公差', type : 'LineEdit', property : {tool_tip : '等间距公差,默认是0.005mm'}, }, { name : 'auto_save', title : '自动保存', type : 'RadioBox', property : { item_list:[ {name:'yes',text:'YES'}, {name:'no',text:'NO'}, ], tool_tip:'是否自动保存料号开关' } } ] VERSION_HISTORY: V1.00 2020-04-20 Scott Sun 1.新版本 HELP:

功能简介

设置孔属性


参数配置


注意事项


*/ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// console.log("==============================>set drill"); // 引入模块 包 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 Status = 'ok'; var resultData = []; var PAR = {}; if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); } try { var par = PAR; var default_par = { max_via_size: "0.9mm", min_via_num: "100", equidistant_tolerance: "0.005mm", auto_save: "No" } for(var key in default_par){ // 设置默认属性 if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] } } var max_via_size = parseFloat(par.max_via_size); var equidistant_tolerance = parseFloat(par.equidistant_tolerance); if(_.isEmpty(Job)){throw "参数Job不存在"} var job = Job.toLowerCase() // 检查料号是否存在 if(!GEN.isJobExists({job:job})){throw "料号已经:"+job+"不存在"} // 检查料号是否被打开 if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) } // 检查料号是否能够check out if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } GEN.checkInout({job:job,mode:"out"}); // 通过matrix获取board属性的钻孔层 var matrix = GEN.getMatrix({job:job}) var dirll_layer = Object.keys(matrix).reduce(function(a,b){ if(matrix[b].context == "board" && matrix[b].layer_type == "drill"){ a.push(b) } return a },[]); let anquanqupartition = { "kitchen" : { "fridge": ["蛋鸟鱼各类猎物","各类蔬菜,蘑菇,浆果"], "box1": ["各种罐头"], "box2": ["面粉","大米","面条","面包","方便面"], "box3": ["麦片","通心粉","爆米花", "微波食品", ], "box4": ["咖啡","茶包" ], "box5": ["锅碗","杯子餐具","烤盘" ], "box6": ["糖盐醋酵母黄油等调料" ], "box": ["青蛙"], }, "farming": { "feiliao":[ "堆肥箱" , "肥料蚯蚓箱", "腐烂食品存放箱" ], "box1": [ "种子" ], "box2": [ "农业用具" ], }, "tools": { "material": { }, "items": { } }, "oil":{}, "water": {}, "search": {}, "hunter": {}, "wood": {} } let che = { smallBox: [ "foods","water","medical","tea&coffee" ], seat: [ "cup","caoguo","piaobaiping","knife","发电机","丙烷喷灯&焊工面罩","螺丝刀","扳手","拉板钳,千斤顶、轮胎泵、汽车电池充电器" ], trunk: [ "油箱","" ] } // var stepList = GEN.getStepList({job:job}); stepList.forEach(function(step){ GEN.openStep({job:job,name:step}) dirll_layer.forEach(function(layer){ // 逐层设置钻孔工作层 GEN.workLayer({name:layer,display_number:2,clear_before:'yes'}) // 分析via孔:排除超过max_via_size的孔径的孔,排除数量少于min_via_num数量的钻孔,排除存在等间距equidistant_tolerance的钻孔 // 排除超过max_via_size的孔径的孔 var layerSymsHist = GEN.getLayerSymsHist({job:job,step:step,layer:layer}); var via_symbol = Object.keys(layerSymsHist).map(function(v){return layerSymsHist[v]}) via_symbol = via_symbol.filter(function(item){ if(!item.size && item.width){ var max_tmp = item.width > item.height ? item.width : item.height item.size = max_tmp } if(!item.size){item.size = 0} return Number(item.size) <= max_via_size }) // 排除少于min_via_num数量的钻孔 via_symbol = via_symbol.filter(function(item){ if(item.pad == 0){return false} return item.pad >= Number(par.min_via_num) }); console.log("via_symbols================================:" + _.toString(via_symbol)) if(via_symbol.length){ GEN.selectByFilter({ feat_types:"pad", include_syms: via_symbol.map(function(v){return v.symbol}).join(",") }); // 将选中的复制到辅助层 var layer_tmp = layer + "_tmp"; if(GEN.isLayerExists({job:job,layer:layer_tmp})){GEN.deleteLayer({job:job,step:step,layer:layer_tmp})} GEN.selCopyOther({dest:"layer_name",target_layer:layer_tmp,invert:'no'}); GEN.selClearFeature(); GEN.workLayer({name:layer_tmp,display_number:2,clear_before:'yes'}); var ck = "tmp_chk" if(GEN.isChklistExists({job:job,step:step,chklist:ck})){ GEN.COM("chklist_delete", { chklist: ck }) } // 创建并运行 GEN.createChklist({ // 创建checklist chklist: ck, items: [{ name: "viaPitch", nact: 1, action: "valor_analysis_signal", erf: "S2_conductor_Check", params: { pp_layer: ".affected", pp_spacing: 20, pp_selected: "All", pp_r2c: 10, pp_d2c: 15, pp_sliver: 8, pp_min_pad_overlap: 5, pp_check_missing_pads_for_drills: "Yes", pp_use_compensated_rout: "Skeleton", pp_sm_spacing: "Yes", pp_tests: "Spacing", pp_check_missing_pads_for_drills:"Yes" } }] }); GEN.chklistShow({ chklist: ck }); GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" }); GEN.chklistRun({ chklist: ck, nact: 1, area: "profile" }) var tmp_layer1 = "mk_1_"+layer_tmp+"_pitch"; var tmp_layer2 = "ms_1_"+layer_tmp+"_pitch"; if(GEN.isLayerExists({job:job,layer:tmp_layer1})){ GEN.deleteLayer({job:job,layer:tmp_layer1}); } if(GEN.isLayerExists({job:job,layer:tmp_layer2})){ GEN.deleteLayer({job:job,layer:tmp_layer2}); } GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch"); GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'}); GEN.selectByFilter({attribute:[{attribute:".string",text:"via_pitch"}]}); var tmp_layer2_tmp = tmp_layer2 + "_tmp"; if(GEN.isLayerExists({job:job,layer:tmp_layer2})){ GEN.deleteLayer({job:job,layer:tmp_layer2_tmp}); } GEN.selCopyOther({dest:"layer_name",target_layer:tmp_layer2_tmp,invert:'no'}); GEN.selClearFeature(); GEN.workLayer({name:tmp_layer2_tmp,display_number:1,clear_before:'yes'}); var symbols_tmp = GEN.getLayerSymsHist({job:job,layer:tmp_layer2_tmp,step:step}); // 找出间距 equidistant_tolerance 的 var equidistant_tolerance_symbol = _.values(symbols_tmp).filter(function(item){ return Math.abs(Number(item.size) - equidistant_tolerance) < 0.000001 }) // 如果有 根据上面找到的 参考选择 删掉 layer_tmp 层里的钻孔 if(equidistant_tolerance_symbol.length){ GEN.selectByFilter({ exclude_syms:equidistant_tolerance_symbol.map(function(v){return v.symbol}).join(",") }) GEN.selDelete(); GEN.workLayer({name:layer_tmp,display_number:2,clear_before:'yes'}); GEN.selRefFeat({layers:tmp_layer2_tmp,use:'filter',mode:'touch'}); GEN.selDelete(); } // 根据layer_tmp层的钻孔参考选择出 层里面的镭射层 GEN.selClearFeature() GEN.workLayer({name:layer,display_number:2,clear_before:'yes'}) GEN.selRefFeat({layers:layer_tmp,use:'filter',mode:'touch'}) // 设置选中的via孔属性 if(GEN.getSelectCount() > 0){ GEN.COM("cur_atr_set,attribute=.drill,option=via") GEN.COM("sel_change_atr,mode=add") GEN.selClearFeature() } // 删除辅助层 var deleLayers = [tmp_layer1, tmp_layer2, tmp_layer2_tmp, layer_tmp]; deleLayers.forEach(function(v){ GEN.deleteLayer({job:job,layer:v}); }); } }); GEN.closeStep(); }); // // 保存 if(/yes/ig.test(par.auto_save)){ GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号 GEN.saveJob({ job: job }); GEN.checkInout({job:job,mode:"in"}) GEN.closeJob({job:job}) } else { GEN.checkInout({job:job,mode:"in"}) } 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}; }