Commit 766b3724 authored by Scott Sun's avatar Scott Sun

Merge branch 'master' of http://gitlab.topibd.net/scott.sun/scott

parents e119b114 5352543e
...@@ -74,6 +74,7 @@ var db = $.db; ...@@ -74,6 +74,7 @@ var db = $.db;
var Status = 'ok'; var Status = 'ok';
var resultData = []; var resultData = [];
var PAR = {}; var PAR = {};
var ALL = {}
if ($.hasOwnProperty('script_parameter')){ if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter); PAR = JSON.parse($.script_parameter);
} }
...@@ -81,8 +82,6 @@ try { ...@@ -81,8 +82,6 @@ try {
console.log("=============================================>anaysis_start"); console.log("=============================================>anaysis_start");
var par = PAR; var par = PAR;
if(par.erf == ""){delete PAR.erf} if(par.erf == ""){delete PAR.erf}
// if(par.erf == ""){par.erf = "GBM_0.50z"}
if(_.isEmpty(Job)) throw "没有传入料号名!"; if(_.isEmpty(Job)) throw "没有传入料号名!";
var job = Job.toLowerCase(); var job = Job.toLowerCase();
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" } if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
...@@ -131,7 +130,113 @@ try { ...@@ -131,7 +130,113 @@ try {
} }
} }
}) })
GEN.clearLayers()
// * new 钻孔叠构
var cam_drill_structure = []
var stack_drills = _.values(matrix).filter(function(item){
return item.layer_type == "drill" && item.context == "board"
})
var layerCount = GEN.getLayerCount({job:job})
stack_drills.forEach(function(drill){
GEN.clearLayers()
GEN.selClearFeature()
var drill_info = {}
var drl_start_num = drill.drl_start_num -0
var drl_end_num = drill.drl_end_num-0
drill_info.drl_start_num = drl_start_num
drill_info.drl_end_num = drl_end_num
var drl_side = "None"
if(layerCount/2 >= drl_start_num){
drl_side = "Top"
} else {
drl_side = "Bot"
}
drill_info.drl_side = drl_side
var drl_filler = "None"
if(drill.type == "laser_drill"){
drill_info.drl_type = "Laser"
drill_info.drl_name = "Laser" + drl_start_num + "-" + drl_end_num
drill_info.drl_tech = "LDD"
// 计算此层的理论 top bot
if(drl_side == "Top"){
if((drl_start_num-1)==0){ drl_filler = "None" }
else {
var top_l = "d" + (drl_start_num-1) + "-" + (drl_end_num-1)
if(GEN.isLayerExists({job:job, layer:top_l})){
GEN.clearLayers()
GEN.selClearFeature()
GEN.workLayer({name:top_l,display_number:2,clear_before:'yes'})
GEN.selRefFeat({layers:drill.name,use:'filter',mode:'touch'})
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
drl_filler="Via Filling"
}
}
}
var bot_l = "d" + (drl_start_num+1) + "-" + (drl_end_num+1)
if(GEN.isLayerExists({job:job, layer:bot_l})){
GEN.clearLayers()
GEN.selClearFeature()
GEN.workLayer({name:drill.name,display_number:2,clear_before:'yes'})
GEN.selRefFeat({layers:bot_l,use:'filter',mode:'touch'})
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
drill_info.drl_overlap = "Yes"
} else {
drill_info.drl_overlap = "No"
}
}else{ drill_info.drl_overlap = "No" }
}else if (drl_side == "Bot"){
if((drl_end_num-layerCount)==0){ drl_filler = "None" }
else {
var top_l = "d" + (drl_start_num+1) + "-" + (drl_end_num+1)
if(GEN.isLayerExists({job:job, layer:top_l})){
GEN.clearLayers()
GEN.selClearFeature()
GEN.workLayer({name:top_l,display_number:2,clear_before:'yes'})
GEN.selRefFeat({layers:drill.name,use:'filter',mode:'touch'})
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
drl_filler="Via Filling"
}
}
}
var bot_l = "d" + (drl_start_num-1) + "-" + (drl_end_num-1)
if(GEN.isLayerExists({job:job, layer:bot_l})){
GEN.clearLayers()
GEN.selClearFeature()
GEN.workLayer({name:drill.name,display_number:2,clear_before:'yes'})
GEN.selRefFeat({layers:bot_l,use:'filter',mode:'touch'})
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
drill_info.drl_overlap = "Yes"
}else {
drill_info.drl_overlap = "No"
}
}else{ drill_info.drl_overlap = "No" }
}
} else {
GEN.workLayer({name:drill.name,display_number:2,clear_before:'yes'})
GEN.selectByFilter({attribute:'.drill',option:'plated'})
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
drill_info.drl_type = "PTH"
if(drl_end_num - drl_start_num == 1){drl_filler = "Resin Plugin"}
drill_info.drl_name = "PTH" + drl_start_num + "-" + drl_end_num
}else{
drill_info.drl_type = "NPTH"
drill_info.drl_name = "NPTH" + drl_start_num + "-" + drl_end_num
}
}
drill_info.drl_filler = drl_filler
drill_info.drl_zones = "{A}"
cam_drill_structure.push(drill_info)
// save_stack_info({info:drill_info})
})
save_job_info({
jobid: JobId,
jobinfohash: {cam_drill_structure: JSON.stringify(cam_drill_structure)}
})
GEN.closeStep() GEN.closeStep()
console.log("===================>steplist:"+_.toString(step_list)) console.log("===================>steplist:"+_.toString(step_list))
if(step_list.indexOf(pcs_step)<0){throw "can not find pcsstep"} if(step_list.indexOf(pcs_step)<0){throw "can not find pcsstep"}
...@@ -157,15 +262,89 @@ try { ...@@ -157,15 +262,89 @@ try {
} }
} }
// * profile 和 拼版
var pandle_step = step_list.map(function(v){
var type = "unknow";
if(/^cad|^pcs/ig.test(v)){
type = "pcs"
} else if (/^arr|^stp/ig.test(v)) {
type = "array"
}
var panel_info = {job_id:JobId,step_name:v,step_type:type}
GEN.openStep({job:job,name:v})
GEN.clearLayers()
GEN.selClearFeature()
var profileLimits = GEN.getProfileLimits({job:job,step:v,units:"mm"})
if(profileLimits){
panel_info.size_x = Number(profileLimits.xsize).toFixed(3)
panel_info.size_y = Number(profileLimits.ysize).toFixed(3)
}
panel_info.datum_x = 0
panel_info.datum_y = 0
panel_info.margin = {"margin_top": 0, "margin_left": 0, "margin_right": 0, "margin_bottom": 0, "allow_margin_top": 0, "allow_margin_left": 0, "allow_margin_right": 0, "allow_margin_bottom": 0}
var profile = GEN.getProfile({job:job,step:v,units:"mm"}).split("\n")
if(profile.length>=1){
var tmp = profile.slice(1)
tmp = tmp.map(function(v){
if(v[0]==="#"){v = v.slice(1)}
return v
})
panel_info.profile = tmp.join("\n")
} else {
profile = profile.map(function(v){
if(v[0]==="#"){v = v.slice(1)}
return v
})
panel_info.profile = profile.join("\n")
}
for(var key in profileLimits){
profileLimits[key] = Number(profileLimits[key])
}
panel_info.profile_limits = profileLimits
panel_info.attr_data= {}
panel_info.extra_data= {}
var repeat = GEN.getSR1({job:job,step:v,units:"mm"})
var step_repeat = {}
repeat.forEach(function(item, i){
step_repeat[String(i)] = {
x:item.xa,
y:item.ya,
dx: item.dx,dy: item.dy,
nx:item.nx,ny:item.ny,
// gapX:item.xsize,gapY:item.ysize,
step:item.step,
angle:item.angle,
mirror:item.mirror == "no" ? 0 : 1,
step_name:item.step,
step_type:/cad|pcs|card/ig.test(item.step)? "pcs" : "array",
}
})
panel_info.step_repeat = step_repeat
save_panel_info({info:panel_info, table:"pdm_job_panelizer_step"})
GEN.closeStep()
return {name:v, type:type}})
// glod_finger
var gold_fingers = Object.keys(tmp_matrix).filter(function(v){return /^top_enig$|^bot_enig$/ig.test(v)})
if(gold_fingers.length){
gold_fingers = gold_fingers.map(function(v){
var type = (v=="top_enig") ? "top" : "bot"
return {name:v, type:type}
})
}
ALL.gold_fingers = gold_fingers
GEN.closeStep() GEN.closeStep()
var config = { var config = {
jobInfo: { jobInfo: {
layer_count: ["signal","power_ground"], // Board属性的signal或者power_ground层 layer_count: ["signal","power_ground"], // Board属性的signal或者power_ground层
vc_card_size_w: {api:"vc_card_size", props:"xsize"}, // card短边尺寸 // ? 保留小数 pcs_size_x: {api:"vc_card_size", props:"xsize"}, // card短边尺寸 // ? 保留小数
vc_card_size_l: {api:"vc_card_size", props:"ysize"}, // card长边尺寸 // ? 保留小数 pcs_size_y: {api:"vc_card_size", props:"ysize"}, // card长边尺寸 // ? 保留小数
vc_array_size_w: {api:"vc_array_size", props:"xsize"}, // ! array短边尺寸 需要arr_step // ? 保留小数 array_size_x: {api:"vc_array_size", props:"xsize"}, // ! array短边尺寸 需要arr_step // ? 保留小数
vc_array_size_l: {api:"vc_array_size", props:"ysize"}, // ! array长边尺寸 需要arr_step // ? 保留小数 array_size_y: {api:"vc_array_size", props:"ysize"}, // ! array长边尺寸 需要arr_step // ? 保留小数
vc_pcs_count_on_panel: true, // array中pcs的数量 ! 需要arr_step vc_pcs_count_on_panel: true, // array中pcs的数量 ! 需要arr_step
pcs_count_on_array: true,
stack_vias_number: true, // via孔连续叠加的层数 stack_vias_number: true, // via孔连续叠加的层数
stack_vias_more: {only_value:true}, // yes|no : 14层板以上时,Stack Vias >=12时,存yes // ! 需要分析完via连续叠加层数 stack_vias_more: {only_value:true}, // yes|no : 14层板以上时,Stack Vias >=12时,存yes // ! 需要分析完via连续叠加层数
depth_drilling: {api:"layer_exist", props:"depth_drill"}, // yes|no :存在 depth_drill 层时 ,存yes depth_drilling: {api:"layer_exist", props:"depth_drill"}, // yes|no :存在 depth_drill 层时 ,存yes
...@@ -173,14 +352,14 @@ try { ...@@ -173,14 +352,14 @@ try {
laser_via_on_buried_hole: true, // via孔在埋孔上时,存yes laser_via_on_buried_hole: true, // via孔在埋孔上时,存yes
milling_bit_size: true, // todo 检查array中pcs的最小间距值 milling_bit_size: true, // todo 检查array中pcs的最小间距值
milling_length: true, // todo 检查array中铣切长度 milling_length: true, // todo 检查array中铣切长度
vc_src_01005_pad_result: {api:"board_has_attr", props:"01005_pad"}, vc_src_01005_pad_result: {api:"board_has_attr", props:".pth_pad"}, // 本地使用 .pth_pad
vc_src_EDGE_PLATING: {api:"layer_exist2", props:["fab_page2"]}, // fab_page2
ATS_technology_25dc: {api:"layer_exist", props:["bend","top_coverlay"]}, // yes|no:存在cavity层别时存yes ATS_technology_25dc: {api:"layer_exist", props:["bend","top_coverlay"]}, // yes|no:存在cavity层别时存yes
ATS_technology_25dr: {api:"layer_exist", props:"nclegend-1-2"}, // yes|no:存在cavity层别时存yes ATS_technology_25dr: {api:"layer_exist", props:"nclegend-1-2"}, // yes|no:存在cavity层别时存yes
vc_src_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层 // vc_src_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层
vc_src_EDGE_PLATING: {api:"layer_exist2", props:["fab_page2"]}, // fab_page2
edge_plating_length: true, // todo 检查线路外形处物件的长度 edge_plating_length: true, // todo 检查线路外形处物件的长度
glod_finger: true, // todo yes|no:暂无逻辑 gold_finger: true, //
glod_finger_area: true, // todo 暂无逻辑 glod_finger_area: true, //
ATS_sm_side: true, // top|bot|both:检查防焊层所在面次 ATS_sm_side ATS_sm_side: true, // top|bot|both:检查防焊层所在面次 ATS_sm_side
vc_id_print_side: true, // top|bot|both:检查文字层所在面次 vc_id_print_side vc_id_print_side: true, // top|bot|both:检查文字层所在面次 vc_id_print_side
min_drl_size: true, // todo 0.5mm 最小圆孔 min_drl_size: true, // todo 0.5mm 最小圆孔
...@@ -245,7 +424,7 @@ try { ...@@ -245,7 +424,7 @@ try {
GEN.COM('sredit_reduce_nesting,mode=one_highest') GEN.COM('sredit_reduce_nesting,mode=one_highest')
drill_info[step] = drill_info[step] || {}; drill_info[step] = drill_info[step] || {};
drillLayers.forEach(function(layer){ drillLayers.forEach(function(layer){
var layer_tool_manager = GEN.getTool({job:job, step:step,layer:layer.name}) var layer_tool_manager = GEN.getTool({job:job, step:step,layer:layer.name,units:"mm"})
drill_info[step][layer.name] = layer_tool_manager drill_info[step][layer.name] = layer_tool_manager
}) })
GEN.closeStep() GEN.closeStep()
...@@ -259,27 +438,36 @@ try { ...@@ -259,27 +438,36 @@ try {
var tool = pcs_tool_manager[layer][key]; var tool = pcs_tool_manager[layer][key];
var array_count; var array_count;
if(array_tool_manager && array_tool_manager[layer] && array_tool_manager[layer][key]){array_count = array_tool_manager[layer][key].count} if(array_tool_manager && array_tool_manager[layer] && array_tool_manager[layer][key]){array_count = array_tool_manager[layer][key].count}
var layer_name = layer
var drill_type = tool.type
var finish_size = tool.finish_size - 0
if(matrix[layer].type == "laser_drill"){
drill_type = "laser"
layer_name = layer_name.replace("d", "l") }
if(matrix[layer].type == "bury_drill"){
drill_type = "via"
}
var data = { var data = {
job_id: JobId, job_id: JobId,
layer_name: layer, layer_name: layer_name,
tool_num: key, tool_num: key,
tool_flag: key, tool_flag: key,
tool_type: tool.shape, tool_type: tool.shape,
drill_type:tool.type, drill_type:drill_type,
drill_size : tool.drill_size, // drill_size : tool.drill_size,
drill_slot_length: tool.slot_len, // drill_slot_length: tool.slot_len,
finish_size : tool.finish_size, finish_size : finish_size.toFixed(3),
finish_slot_length: tool.slot_len, finish_slot_length: tool.slot_len,
size_tol_lower: tool.min_tol, // size_tol_lower: tool.min_tol,
size_tol_upper: tool.max_tol, // size_tol_upper: tool.max_tol,
pcs_count: tool.count, pcs_count: tool.count,
array_count: array_count, // todo array_count: array_count,
attr_data: {} // {"allowance": 2, "org_layer_name": "hhhh"} attr_data: {"org_layer_name":layer} // {"allowance": 2, "org_layer_name": "hhhh"}
} }
if(!array_count){delete data.array_count} if(!array_count){delete data.array_count}
var id = db.query("",function(q){ var id = db.query("",function(q){
return q.selectValue({ return q.selectValue({
table:'pdm_job_cam_drill', table:'pdm_job_cam_drill',
field:"id", field:"id",
where:{job_id:JobId, layer_name: layer,tool_num: key} where:{job_id:JobId, layer_name: layer,tool_num: key}
}) })
...@@ -306,29 +494,27 @@ try { ...@@ -306,29 +494,27 @@ try {
}) })
}) })
// console.log("=============================> 6 set smd bga")
// var allStep = GEN.getStepList({job:job})
console.log("=============================> 6 set smd bga") // allStep.forEach(function(step){
var allStep = GEN.getStepList({job:job}) // GEN.openStep({job:job,name:step})
allStep.forEach(function(step){ // GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd")
GEN.openStep({job:job,name:step}) // GEN.COM("chklist_cupd,chklist=valor_cleanup_set_smd,nact=1,params=((pp_layer=.type=signal|mixed&side=top|bottom)(pp_work_on=SMD\;BGA)(pp_delete=No)(pp_types=Square\;Rect\;Oval)(pp_other_smd=)(pp_sm=No)(pp_drill=)(pp_rotate=No)(pp_ignore_covered=Yes)(pp_bga_types=Round)(pp_other_bga=)(pp_sm_bga=No)(pp_bga_max_pitch=70)(pp_bga_actions=Set attribute)(pp_bga_suffix=_bga)(pp_identify_gf=)),mode=regular")
GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd") // GEN.COM("get_user_name")
GEN.COM("chklist_cupd,chklist=valor_cleanup_set_smd,nact=1,params=((pp_layer=.type=signal|mixed&side=top|bottom)(pp_work_on=SMD\;BGA)(pp_delete=No)(pp_types=Square\;Rect\;Oval)(pp_other_smd=)(pp_sm=No)(pp_drill=)(pp_rotate=No)(pp_ignore_covered=Yes)(pp_bga_types=Round)(pp_other_bga=)(pp_sm_bga=No)(pp_bga_max_pitch=70)(pp_bga_actions=Set attribute)(pp_bga_suffix=_bga)(pp_identify_gf=)),mode=regular") // GEN.COM("get_job_path,job="+job)
GEN.COM("get_user_name") // GEN.COM("disp_on")
GEN.COM("get_job_path,job="+job) // GEN.COM("origin_on")
GEN.COM("disp_on") // GEN.COM("chklist_cnf_act,chklist=valor_cleanup_set_smd,nact=1,cnf=no")
GEN.COM("origin_on") // GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("chklist_cnf_act,chklist=valor_cleanup_set_smd,nact=1,cnf=no") // GEN.COM("skip_next_pre_hook")
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile") // GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("skip_next_pre_hook") // GEN.COM("get_user_name")
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile") // GEN.COM("skip_current_command")
GEN.COM("get_user_name") // GEN.COM("disp_on")
GEN.COM("skip_current_command") // GEN.COM("origin_on")
GEN.COM("disp_on") // GEN.COM("show_tab,tab=Checklists,show=no")
GEN.COM("origin_on") // GEN.closeStep()
GEN.COM("show_tab,tab=Checklists,show=no") // })
GEN.closeStep()
})
// GEN.createChklist() // GEN.createChklist()
...@@ -426,8 +612,30 @@ try { ...@@ -426,8 +612,30 @@ try {
}) })
stepList.forEach(function(step){ stepList.forEach(function(step){
GEN.openStep({ job: job, name: step }) GEN.openStep({ job: job, name: step })
// 曝光
// 曝光
analysis_obj.matrixInfo.mOuters.forEach(function(item){ analysis_obj.matrixInfo.mOuters.forEach(function(item){
if(ALL.gold_fingers.length>0){
var tmp_gold_info = {}
ALL.gold_fingers.forEach(function(item2){
tmp_gold_info[item2.type] = item2.name
})
var layer_gold_type = /top/ig.test(item.signalL) ? "top" : "bot"
if(tmp_gold_info[layer_gold_type]){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:tmp_gold_info[layer_gold_type]})
// console.log(_.toString({
// ref_layer: tmp_gold_info[item.type],
// exposed_area: tmp_info
// }));
save_layerinfo({
jobid: JobId,
layer: item.signalL,
layerinfohash: {
sf_area_gold_area: tmp_info.percent
}
})
}
}
if(item.solderL){ if(item.solderL){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL}) var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL})
// {"area":"0.73817","percent":"8.986"} // {"area":"0.73817","percent":"8.986"}
...@@ -450,6 +658,36 @@ try { ...@@ -450,6 +658,36 @@ try {
}) })
GEN.clearLayers() GEN.clearLayers()
GEN.affectedLayer({ affected: 'no', mode: 'all' }) GEN.affectedLayer({ affected: 'no', mode: 'all' })
console.log("==================================> Drill analysis")
// 钻孔
var drillToSignals = drillLayers.map(function(v){ // 获取到钻孔层对应的顶层和底层
var simbols = GEN.getLayerSymsHist({job:job,step:step,layer:v})
var symbol = _.values(simbols).sort(function(a,b){return Number(a.size)-Number(b.size)})
.reduce(function(a,b){
if(b.pad!="0"){
a.push(b.symbol)
}
return a
},[])[0]
return {layer:v,symbol:symbol,start:tmp_matrix[v]["drl_start"],end:tmp_matrix[v]["drl_end"]}
})
console.log("==================================> 12 Drill analysis")
var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果
console.log("===============drillRes:" + _.toString(drillRes));
drillRes.forEach(function(item){
save_layerinfo({
jobid: JobId,
layer: item.layer,
layerinfohash: {
drl_pad_top: item.drl_pad_top,
drl_pad_bot: item.drl_pad_bot,
}
})
})
// 创建chklist并运行 如果chklist存在先删除 // 创建chklist并运行 如果chklist存在先删除
if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) { if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) {
GEN.COM("chklist_delete", { chklist: oChecklistName }) GEN.COM("chklist_delete", { chklist: oChecklistName })
...@@ -481,34 +719,6 @@ try { ...@@ -481,34 +719,6 @@ try {
console.log("==================================> 11 signals analysis") console.log("==================================> 11 signals analysis")
// signal层分析结果 // signal层分析结果
var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName}) var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName})
console.log("==================================> Drill analysis")
// 钻孔
var drillToSignals = drillLayers.map(function(v){ // 获取到钻孔层对应的顶层和底层
var simbols = GEN.getLayerSymsHist({job:job,step:step,layer:v})
var symbol = _.values(simbols).sort(function(a,b){return Number(a.size)-Number(b.size)})
.reduce(function(a,b){
if(b.pad!="0"){
a.push(b.symbol)
}
return a
},[])[0]
return {layer:v,symbol:symbol,start:tmp_matrix[v]["drl_start"],end:tmp_matrix[v]["drl_end"]}
})
console.log("==================================> 12 Drill analysis")
var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果
console.log("===============drillRes:" + _.toString(drillRes));
drillRes.forEach(function(item){
save_layerinfo({
jobid: JobId,
layer: item.layer,
layerinfohash: {
drl_pad_top: item.drl_pad_top,
drl_pad_bot: item.drl_pad_bot,
}
})
})
// 数据入库 // 数据入库
Object.keys(res).forEach(function(key){ Object.keys(res).forEach(function(key){
var val = res[key] var val = res[key]
...@@ -519,7 +729,6 @@ try { ...@@ -519,7 +729,6 @@ try {
}) })
}) })
GEN.closeStep() GEN.closeStep()
}) })
...@@ -820,6 +1029,45 @@ function save_layerinfo(props){ // 保存层信息 ...@@ -820,6 +1029,45 @@ function save_layerinfo(props){ // 保存层信息
} }
}) })
} }
function save_stack_info(props){
var info = props.info
var table = "pdm_job_stack_drills"
info.job_id = JobId
var drl_name = info.drl_name
db.query("",function(q){
return q.deleteRow({
table:table,
where:{job_id:JobId, drl_name: drl_name}
})
});
console.log(_.toString(info))
var Re = db.query("",function(q){
return q.insertRow({
table:table,
data:info,
return_field:'job_id',
})
});
}
function save_panel_info(props){
var info = props.info
var table = props.table
info.job_id = JobId
var job_id = info.job_id || JobId
var step_name = info.step_name
db.query("",function(q){
return q.deleteRow({
table:table,
where:{job_id:job_id, step_name: step_name}
})
});
db.query("",function(q){
return q.insertRow({
table:table,
data:info
})
});
}
function analysis(props){ function analysis(props){
var job = props.job || Job; var job = props.job || Job;
var jobId = props.jobId || JobId; var jobId = props.jobId || JobId;
...@@ -870,6 +1118,16 @@ function analysis(props){ ...@@ -870,6 +1118,16 @@ function analysis(props){
} }
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_pcs_count_on_array = function(props){ //
if(!this.array_step){return "_error"}
var has_step = has_steps({job:this.job, pcs_step:this.pcs_step ,array_step:this.array_step}) // 有无拼版关系
if(has_step){
// arr 中 pcs数量
var tmp = GEN.getRepeat({job:job, step:array_step})
return tmp.length
}
return "_todo"
}
T_m_p.prototype.analysis_stack_vias_number = function(props){ // via孔连续叠加的层数 T_m_p.prototype.analysis_stack_vias_number = function(props){ // via孔连续叠加的层数
var t = this; var t = this;
var res; var res;
...@@ -948,9 +1206,9 @@ function analysis(props){ ...@@ -948,9 +1206,9 @@ function analysis(props){
T_m_p.prototype.analysis_layer_exist2 = function(props){ // 存在某某层? string T_m_p.prototype.analysis_layer_exist2 = function(props){ // 存在某某层? string
var layers = Object.keys(this.matrixInfo.matrix) var layers = Object.keys(this.matrixInfo.matrix)
if(/string/ig.test(typeof(props))){ if(/string/ig.test(typeof(props))){
return layers.indexOf(props) >= 0 ? "yes" : "unknow" return layers.indexOf(props) >= 0 ? "yes" : "no"
} else { } else {
var res = "unknow" var res = "no"
props.forEach(function(v){ props.forEach(function(v){
if(layers.indexOf(v)>=0){ if(layers.indexOf(v)>=0){
res = "yes" res = "yes"
...@@ -1054,10 +1312,28 @@ function analysis(props){ ...@@ -1054,10 +1312,28 @@ function analysis(props){
T_m_p.prototype.analysis_edge_plating_length = function(){ // todo T_m_p.prototype.analysis_edge_plating_length = function(){ // todo
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_glod_finger = function(){ // todo T_m_p.prototype.analysis_gold_finger = function(){ //
return "_todo" if(!ALL.gold_fingers){return "no"}
return ALL.gold_fingers.length > 0 ? "yes" : "no"
} }
T_m_p.prototype.analysis_glod_finger_area = function(){ // todo T_m_p.prototype.analysis_glod_finger_area = function(){ //
if(ALL.gold_fingers.length > 0){
GEN.openStep({job:this.job, name:this.pcs_step})
var gold_finger_area = {}
var res = 0;
ALL.gold_fingers.forEach(function(item){
var tmp = GEN.copperArea({layer1:item.name}).percent
res += Number(tmp)
// var tmp = GEN.copperArea({layer1:item.name}).percent + "%"
// var key = item.type == "top" ? "sf_area_gold_area_front" : "sf_area_gold_area_back"
// gold_finger_area[key] = tmp
})
GEN.closeStep()
if(res){
return String(res.toFixed(4)) + "%"
}
}
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_ATS_sm_side = function(){ // 检查防焊层所在面次 T_m_p.prototype.analysis_ATS_sm_side = function(){ // 检查防焊层所在面次
...@@ -1161,7 +1437,7 @@ function smdAnalysis(props){ ...@@ -1161,7 +1437,7 @@ function smdAnalysis(props){
var min_smd_pitch = smdPitch({job:job,step:step,layer:tmp_layer}) // min_smd_pitch var min_smd_pitch = smdPitch({job:job,step:step,layer:tmp_layer}) // min_smd_pitch
// console.log('================= =======min_smd_pitch:' + min_smd_pitch); // console.log('================= =======min_smd_pitch:' + min_smd_pitch);
res[layer.signalL]["min_smd_pitch"] = min_smd_pitch res[layer.signalL]["min_smd_c2c"] = min_smd_pitch
// 分析开窗宽高 // 分析开窗宽高
if(layer.solderL){ if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'}) GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
...@@ -1174,8 +1450,8 @@ function smdAnalysis(props){ ...@@ -1174,8 +1450,8 @@ function smdAnalysis(props){
GEN.workLayer({name:solderL_tmp,display_number:2,clear_before:"yes"}) GEN.workLayer({name:solderL_tmp,display_number:2,clear_before:"yes"})
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step}) var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step})
var symbolInfo_solder = symbolAnalysis({symbols:symbols_solder,filterReg:/^rect/}) var symbolInfo_solder = symbolAnalysis({symbols:symbols_solder,filterReg:/^rect/})
if(symbolInfo_solder["min_width"]){res[layer.signalL].min_smd_opening_width = symbolInfo_solder["min_width"]} if(symbolInfo_solder["min_width"]){res[layer.signalL].min_smd_sm_width = symbolInfo_solder["min_width"]}
if(symbolInfo_solder["min_length"]){res[layer.signalL].min_smd_opening_length = symbolInfo_solder["min_length"]} if(symbolInfo_solder["min_length"]){res[layer.signalL].min_smd_sm_length = symbolInfo_solder["min_length"]}
GEN.deleteLayer({job:job,layer:solderL_tmp}) GEN.deleteLayer({job:job,layer:solderL_tmp})
} }
GEN.deleteLayer({job:job,layer:tmp_layer}) GEN.deleteLayer({job:job,layer:tmp_layer})
...@@ -1759,4 +2035,5 @@ function has_steps(props){ ...@@ -1759,4 +2035,5 @@ function has_steps(props){
var array_step = props.array_step var array_step = props.array_step
var res = GEN.getSubSteps({job:job, step:array_step}) var res = GEN.getSubSteps({job:job, step:array_step})
return res.indexOf(pcs_step) >= 0 return res.indexOf(pcs_step) >= 0
} }
\ No newline at end of file
...@@ -74,6 +74,7 @@ var db = $.db; ...@@ -74,6 +74,7 @@ var db = $.db;
var Status = 'ok'; var Status = 'ok';
var resultData = []; var resultData = [];
var PAR = {}; var PAR = {};
var ALL = {}
if ($.hasOwnProperty('script_parameter')){ if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter); PAR = JSON.parse($.script_parameter);
} }
...@@ -100,7 +101,6 @@ try { ...@@ -100,7 +101,6 @@ try {
} }
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息 var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
GEN.openStep({job:job, name:pcs_step}) GEN.openStep({job:job, name:pcs_step})
GEN.units({type:"mm"})
_.values(matrix).forEach(function(v){ _.values(matrix).forEach(function(v){
if(v.context == "board" && v.layer_type == "drill"){ if(v.context == "board" && v.layer_type == "drill"){
if(v.type == "laser_drill"){ if(v.type == "laser_drill"){
...@@ -158,6 +158,15 @@ try { ...@@ -158,6 +158,15 @@ try {
} }
} }
// glod_finger
var gold_fingers = Object.keys(tmp_matrix).filter(function(v){return /^top_enig$|^bot_enig$/ig.test(v)})
if(gold_fingers.length){
gold_fingers = gold_fingers.map(function(v){
var type = (v=="top_enig") ? "top" : "bot"
return {name:v, type:type}
})
}
ALL.gold_fingers = gold_fingers
GEN.closeStep() GEN.closeStep()
var config = { var config = {
jobInfo: { jobInfo: {
...@@ -166,23 +175,24 @@ try { ...@@ -166,23 +175,24 @@ try {
vc_card_size_l: {api:"vc_card_size", props:"ysize"}, // card长边尺寸 // ? 保留小数 vc_card_size_l: {api:"vc_card_size", props:"ysize"}, // card长边尺寸 // ? 保留小数
vc_array_size_w: {api:"vc_array_size", props:"xsize"}, // ! array短边尺寸 需要arr_step // ? 保留小数 vc_array_size_w: {api:"vc_array_size", props:"xsize"}, // ! array短边尺寸 需要arr_step // ? 保留小数
vc_array_size_l: {api:"vc_array_size", props:"ysize"}, // ! array长边尺寸 需要arr_step // ? 保留小数 vc_array_size_l: {api:"vc_array_size", props:"ysize"}, // ! array长边尺寸 需要arr_step // ? 保留小数
vc_pcs_count_on_panel: true, // todo array中pcs的数量 ! 需要arr_step vc_pcs_count_on_panel: true, // array中pcs的数量 ! 需要arr_step
stack_vias_number: true, // via孔连续叠加的层数 stack_vias_number: true, // via孔连续叠加的层数
stack_vias_more: {only_value:true}, // yes|no : 14层板以上时,Stack Vias >=12时,存yes // ! 需要分析完via连续叠加层数 stack_vias_more: {only_value:true}, // yes|no : 14层板以上时,Stack Vias >=12时,存yes // ! 需要分析完via连续叠加层数
depth_drilling: {api:"layer_exist", props:"depth_drill"}, // yes|no :存在depth_drill 层时 ,存yes depth_drilling: {api:"layer_exist", props:"depth_drill"}, // yes|no :存在 depth_drill 层时 ,存yes
depth_routing: {api:"layer_exist", props:"depth_routing"}, // tmp yes|no :存在depth_routing 层时,,存yes depth_routing: {api:"layer_exist", props:"depth_routing"}, // tmp yes|no :存在 depth_routing 层时,,存yes
laser_via_on_buried_hole: true, // todo via孔在埋孔上时,存yes laser_via_on_buried_hole: true, // via孔在埋孔上时,存yes
milling_bit_size: true, // todo 检查array中pcs的最小间距值 milling_bit_size: true, // todo 检查array中pcs的最小间距值
milling_length: true, // todo 检查array中铣切长度 milling_length: true, // todo 检查array中铣切长度
vc_src_01005_pad_result: {api:"board_has_attr", props:"01005_pad"}, // * yes|no:board 层中检查存在01005属性物件时,存yes 这里先拿.smd代替了 vc_src_01005_pad_result: {api:"board_has_attr", props:"01005_pad"},
ATS_technology_25dc: {api:"layer_exist", props:"cavity"}, // yes|no:存在cavity层别时存yes ATS_technology_25dc: {api:"layer_exist", props:["bend","top_coverlay"]}, // yes|no:存在cavity层别时存yes
ATS_technology_25dr: {api:"layer_exist", props:"cavity"}, // yes|no:存在cavity层别时存yes ATS_technology_25dr: {api:"layer_exist", props:"nclegend-1-2"}, // yes|no:存在cavity层别时存yes
vc_src_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层 // vc_src_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层
vc_src_EDGE_PLATING: {api:"layer_exist2", props:["fab_page2"]}, // fab_page2
edge_plating_length: true, // todo 检查线路外形处物件的长度 edge_plating_length: true, // todo 检查线路外形处物件的长度
glod_finger: true, // todo yes|no:暂无逻辑 gold_finger: true, //
glod_finger_area: true, // todo 暂无逻辑 glod_finger_area: true, //
solder_mask_side: true, // top|bot|both:检查防焊层所在面次 solder_mask_side ATS_sm_side: true, // top|bot|both:检查防焊层所在面次 ATS_sm_side
silk_screen_side: true, // top|bot|both:检查文字层所在面次 vc_id_print_side: true, // top|bot|both:检查文字层所在面次 vc_id_print_side
min_drl_size: true, // todo 0.5mm 最小圆孔 min_drl_size: true, // todo 0.5mm 最小圆孔
max_pth_drl_size: true, // todo 3.5mm 最大pth圆孔 max_pth_drl_size: true, // todo 3.5mm 最大pth圆孔
max_npth_drl_size: true, // todo 6.0mm 最大npth圆孔 max_npth_drl_size: true, // todo 6.0mm 最大npth圆孔
...@@ -306,39 +316,26 @@ try { ...@@ -306,39 +316,26 @@ try {
}) })
}) })
console.log("=============================> 6 set smd bga") console.log("=============================> 6 set smd bga")
var allStep = GEN.getStepList({job:job}) var allStep = GEN.getStepList({job:job})
allStep.forEach(function(step){ allStep.forEach(function(step){
GEN.openStep({job:job,name:step}) GEN.openStep({job:job,name:step})
console.log(3)
GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd") GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd")
console.log(4)
GEN.COM("chklist_cupd,chklist=valor_cleanup_set_smd,nact=1,params=((pp_layer=.type=signal|mixed&side=top|bottom)(pp_work_on=SMD\;BGA)(pp_delete=No)(pp_types=Square\;Rect\;Oval)(pp_other_smd=)(pp_sm=No)(pp_drill=)(pp_rotate=No)(pp_ignore_covered=Yes)(pp_bga_types=Round)(pp_other_bga=)(pp_sm_bga=No)(pp_bga_max_pitch=70)(pp_bga_actions=Set attribute)(pp_bga_suffix=_bga)(pp_identify_gf=)),mode=regular") GEN.COM("chklist_cupd,chklist=valor_cleanup_set_smd,nact=1,params=((pp_layer=.type=signal|mixed&side=top|bottom)(pp_work_on=SMD\;BGA)(pp_delete=No)(pp_types=Square\;Rect\;Oval)(pp_other_smd=)(pp_sm=No)(pp_drill=)(pp_rotate=No)(pp_ignore_covered=Yes)(pp_bga_types=Round)(pp_other_bga=)(pp_sm_bga=No)(pp_bga_max_pitch=70)(pp_bga_actions=Set attribute)(pp_bga_suffix=_bga)(pp_identify_gf=)),mode=regular")
console.log(5)
GEN.COM("get_user_name") GEN.COM("get_user_name")
console.log(6)
GEN.COM("get_job_path,job="+job) GEN.COM("get_job_path,job="+job)
console.log(7)
GEN.COM("disp_on") GEN.COM("disp_on")
console.log(8)
GEN.COM("origin_on") GEN.COM("origin_on")
console.log(9)
GEN.COM("chklist_cnf_act,chklist=valor_cleanup_set_smd,nact=1,cnf=no") GEN.COM("chklist_cnf_act,chklist=valor_cleanup_set_smd,nact=1,cnf=no")
console.log(10)
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile") GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
console.log(11)
GEN.COM("skip_next_pre_hook") GEN.COM("skip_next_pre_hook")
console.log(12)
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile") GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
console.log(13)
GEN.COM("get_user_name") GEN.COM("get_user_name")
console.log(14)
GEN.COM("skip_current_command") GEN.COM("skip_current_command")
console.log(15)
GEN.COM("disp_on") GEN.COM("disp_on")
console.log(16)
GEN.COM("origin_on") GEN.COM("origin_on")
console.log(17)
GEN.COM("show_tab,tab=Checklists,show=no") GEN.COM("show_tab,tab=Checklists,show=no")
GEN.closeStep() GEN.closeStep()
}) })
...@@ -390,6 +387,42 @@ try { ...@@ -390,6 +387,42 @@ try {
var oChecklistName = "mychecklist" var oChecklistName = "mychecklist"
var signalLayers = analysis_obj.matrixInfo.mSignals.map(function(v){return v.name}) var signalLayers = analysis_obj.matrixInfo.mSignals.map(function(v){return v.name})
var drillLayers = analysis_obj.matrixInfo.mDrills.map(function(v){return v.name}) var drillLayers = analysis_obj.matrixInfo.mDrills.map(function(v){return v.name})
console.log("=============================> 13 save card_copper_distribution")
var copper_distribution_steplist= [pcs_step, array_step];
copper_distribution_steplist.forEach(function(step){
if(step){
GEN.openStep({ job: job, name: step })
// 铜面积 分step
var copper_percent_tmp = signalLayers.map(function(v){
var tmp = {layer:v}
tmp.copper_percent = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
console.log("================ ==signalLayers============"+_.toString(signalLayers));
console.log(_.toString(copper_percent_tmp));
copper_percent_tmp.forEach(function(item){
var save_info = {
jobid: JobId,
layer: item.layer,
}
if(/^cad/ig.test(step)){
save_info.layerinfohash = {
card_copper_distribution: item.copper_percent
}
} else if(/^stp/ig.test(step)){
save_info.layerinfohash = {
array_copper_distribution: item.copper_percent
}
}
save_layerinfo(save_info)
})
GEN.closeStep()
}
})
var info = { var info = {
min_line_width: ["line","user_nor_line"], min_line_width: ["line","user_nor_line"],
min_line_spacing: ["l2l"], min_line_spacing: ["l2l"],
...@@ -403,8 +436,30 @@ try { ...@@ -403,8 +436,30 @@ try {
}) })
stepList.forEach(function(step){ stepList.forEach(function(step){
GEN.openStep({ job: job, name: step }) GEN.openStep({ job: job, name: step })
// 曝光 // 曝光
analysis_obj.matrixInfo.mOuters.forEach(function(item){ analysis_obj.matrixInfo.mOuters.forEach(function(item){
if(ALL.gold_fingers.length>0){
var tmp_gold_info = {}
ALL.gold_fingers.forEach(function(item2){
tmp_gold_info[item2.type] = item2.name
})
var layer_gold_type = /top/ig.test(item.signalL) ? "top" : "bot"
if(tmp_gold_info[layer_gold_type]){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:tmp_gold_info[layer_gold_type]})
// console.log(_.toString({
// ref_layer: tmp_gold_info[item.type],
// exposed_area: tmp_info
// }));
save_layerinfo({
jobid: JobId,
layer: item.signalL,
layerinfohash: {
sf_area_gold_area: tmp_info.percent
}
})
}
}
if(item.solderL){ if(item.solderL){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL}) var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL})
// {"area":"0.73817","percent":"8.986"} // {"area":"0.73817","percent":"8.986"}
...@@ -459,6 +514,7 @@ try { ...@@ -459,6 +514,7 @@ try {
// signal层分析结果 // signal层分析结果
var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName}) var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName})
console.log("==================================> Drill analysis")
// 钻孔 // 钻孔
var drillToSignals = drillLayers.map(function(v){ // 获取到钻孔层对应的顶层和底层 var drillToSignals = drillLayers.map(function(v){ // 获取到钻孔层对应的顶层和底层
var simbols = GEN.getLayerSymsHist({job:job,step:step,layer:v}) var simbols = GEN.getLayerSymsHist({job:job,step:step,layer:v})
...@@ -467,26 +523,14 @@ try { ...@@ -467,26 +523,14 @@ try {
if(b.pad!="0"){ if(b.pad!="0"){
a.push(b.symbol) a.push(b.symbol)
} }
return a return a
},[])[0] },[])[0]
return {layer:v,symbol:symbol,start:matrix[v]["drl_start"],end:matrix[v]["drl_end"]} return {layer:v,symbol:symbol,start:tmp_matrix[v]["drl_start"],end:tmp_matrix[v]["drl_end"]}
}) })
console.log("==================================> 12 Drill analysis") console.log("==================================> 12 Drill analysis")
var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果 var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果
console.log("================drillRes:" + _.toString(drillRes)); console.log("===============drillRes:" + _.toString(drillRes));
throw "tmp"
// 数据入库
Object.keys(res).forEach(function(key){
var val = res[key]
save_layerinfo({
jobid: JobId,
layer: key,
layerinfohash: val
})
})
drillRes.forEach(function(item){ drillRes.forEach(function(item){
save_layerinfo({ save_layerinfo({
jobid: JobId, jobid: JobId,
...@@ -497,25 +541,18 @@ try { ...@@ -497,25 +541,18 @@ try {
} }
}) })
}) })
// 铜面积 // 数据入库
console.log("=============================> 13 save copper_percent") Object.keys(res).forEach(function(key){
var copper_percent_pcs = signalLayers.map(function(v){ var val = res[key]
var tmp = {layer:v}
tmp.copper_percent = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
console.log("================ ==signalLayers============"+_.toString(signalLayers));
console.log(_.toString(copper_percent_pcs));
GEN.closeStep()
copper_percent_pcs.forEach(function(item){
save_layerinfo({ save_layerinfo({
jobid: JobId, jobid: JobId,
layer: item.layer, layer: key,
layerinfohash: { layerinfohash: val
copper_percent: item.copper_percent
}
}) })
}) })
GEN.closeStep()
}) })
// 保存 // 保存
...@@ -784,32 +821,34 @@ function save_layerinfo(props){ // 保存层信息 ...@@ -784,32 +821,34 @@ function save_layerinfo(props){ // 保存层信息
var layerinfohash = props.layerinfohash; var layerinfohash = props.layerinfohash;
Object.keys(layerinfohash).forEach(function(key){ Object.keys(layerinfohash).forEach(function(key){
var val = layerinfohash[key]; var val = layerinfohash[key];
var value = db.query("",function(q){ if(val && val != ""){
return q.selectValue({ var value = db.query("",function(q){
table:'pdm_job_layerattr', return q.selectValue({
field:"value", table:'pdm_job_layerattr',
where:{job_id:jobid, attr_name: key, layer:layer} field:"value",
}) where:{job_id:jobid, attr_name: key, layer:layer}
});
console.log("+==========dblayervalue:" + value)
if(/done/ig.test(value) || !value){
db.query("",function(q){
console.log("+==========insertRowlayervalue:layer:"+layer+";attrname:"+key+";value:"+ val)
return q.insertRow({
table:'pdm_job_layerattr', // todo
data:{job_id:jobid, attr_name:key, value:val, layer:layer}, // todo
return_field:'job_id',
})
});
} else if (value !== val) {
db.query("",function(q){
console.log("+==========updateRowlayer:layer:"+layer+";attrname:"+key+";value:"+ val)
return q.updateRow({
table:'pdm_job_layerattr',
where:{job_id:jobid, attr_name: key},
data:{value:val},
}) })
}); });
console.log("+==========dblayervalue:" + value)
if(/done/ig.test(value) || !value){
db.query("",function(q){
console.log("+==========insertRowlayervalue:layer:"+layer+";attrname:"+key+";value:"+ val)
return q.insertRow({
table:'pdm_job_layerattr', // todo
data:{job_id:jobid, attr_name:key, value:val, layer:layer}, // todo
return_field:'job_id',
})
});
} else if (value !== val) {
db.query("",function(q){
console.log("+==========updateRowlayer:layer:"+layer+";attrname:"+key+";value:"+ val)
return q.updateRow({
table:'pdm_job_layerattr',
where:{job_id:jobid, attr_name: key},
data:{value:val},
})
});
}
} }
}) })
} }
...@@ -854,6 +893,13 @@ function analysis(props){ ...@@ -854,6 +893,13 @@ function analysis(props){
return GEN.getProfileLimits({job:this.job,step:this.array_step,units:"mm"})[props].toFixed(2) return GEN.getProfileLimits({job:this.job,step:this.array_step,units:"mm"})[props].toFixed(2)
} }
T_m_p.prototype.analysis_vc_pcs_count_on_panel = function(props){ // T_m_p.prototype.analysis_vc_pcs_count_on_panel = function(props){ //
if(!this.array_step){return "_error"}
var has_step = has_steps({job:this.job, pcs_step:this.pcs_step ,array_step:this.array_step}) // 有无拼版关系
if(has_step){
// arr 中 pcs数量
var tmp = GEN.getRepeat({job:job, step:array_step})
return tmp.length
}
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_stack_vias_number = function(props){ // via孔连续叠加的层数 T_m_p.prototype.analysis_stack_vias_number = function(props){ // via孔连续叠加的层数
...@@ -931,11 +977,67 @@ function analysis(props){ ...@@ -931,11 +977,67 @@ function analysis(props){
t.jobInfo.laser_info = laser_info; t.jobInfo.laser_info = laser_info;
return res return res
} }
T_m_p.prototype.analysis_layer_exist2 = function(props){ // 存在某某层? string
var layers = Object.keys(this.matrixInfo.matrix)
if(/string/ig.test(typeof(props))){
return layers.indexOf(props) >= 0 ? "yes" : "no"
} else {
var res = "no"
props.forEach(function(v){
if(layers.indexOf(v)>=0){
res = "yes"
}
})
return res
}
}
T_m_p.prototype.analysis_layer_exist = function(props){ // 存在某某层? string T_m_p.prototype.analysis_layer_exist = function(props){ // 存在某某层? string
return this.matrixInfo.matrix.hasOwnProperty(props) ? "yes" : "no" var layers = Object.keys(this.matrixInfo.matrix)
if(/string/ig.test(typeof(props))){
return layers.indexOf(props) >= 0 ? "yes" : "no"
} else {
var res = "no"
props.forEach(function(v){
if(layers.indexOf(v)>=0){
res = "yes"
}
})
return res
}
} }
T_m_p.prototype.analysis_laser_via_on_buried_hole = function(){ // todo T_m_p.prototype.analysis_laser_via_on_buried_hole = function(){ // via孔在埋孔上
return "_todo" var t = this
// 找出 镭射孔 机械孔
var laser_layers = []
var buried_hole = []
for (var key in t.matrix) {
var val = t.matrix[key]
if(val.type == "laser_drill"){
laser_layers.push(val)
} else if(val.type == "blind_drill" || val.type == "bury_drill"){
buried_hole.push(val)
}
}
var res = "no"
if(buried_hole.length>0 && laser_layers.length){ // 有机械孔 和镭射
GEN.openStep({job:t.job,name:t.pcs_step})
GEN.affectedLayer({affected:'no',mode:'all'})
try {
laser_layers.forEach(function(laser){
GEN.workLayer({name:laser,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
buried_hole.forEach(function(buried){
GEN.selRefFeat({layers:buried,use:'filter',mode:'touch'})
if(GEN.getSelectCount()>0){
res = "yes"
throw "yes"
}
})
})
} catch (msg) { }
GEN.closeStep()
}
return res
} }
T_m_p.prototype.analysis_milling_bit_size = function(){ // todo T_m_p.prototype.analysis_milling_bit_size = function(){ // todo
return "_todo" return "_todo"
...@@ -984,41 +1086,59 @@ function analysis(props){ ...@@ -984,41 +1086,59 @@ function analysis(props){
T_m_p.prototype.analysis_edge_plating_length = function(){ // todo T_m_p.prototype.analysis_edge_plating_length = function(){ // todo
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_glod_finger = function(){ // todo T_m_p.prototype.analysis_gold_finger = function(){ //
return "_todo" if(!ALL.gold_fingers){return "no"}
return ALL.gold_fingers.length > 0 ? "yes" : "no"
} }
T_m_p.prototype.analysis_glod_finger_area = function(){ // todo T_m_p.prototype.analysis_glod_finger_area = function(){ //
if(ALL.gold_fingers.length > 0){
GEN.openStep({job:this.job, name:this.pcs_step})
var gold_finger_area = {}
var res = 0;
ALL.gold_fingers.forEach(function(item){
var tmp = GEN.copperArea({layer1:item.name}).percent
res += Number(tmp)
// var tmp = GEN.copperArea({layer1:item.name}).percent + "%"
// var key = item.type == "top" ? "sf_area_gold_area_front" : "sf_area_gold_area_back"
// gold_finger_area[key] = tmp
})
GEN.closeStep()
if(res){
return String(res.toFixed(4)) + "%"
}
}
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_solder_mask_side = function(){ // 检查防焊层所在面次 T_m_p.prototype.analysis_ATS_sm_side = function(){ // 检查防焊层所在面次
var solder_paste_layers = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "solder_mask"}) var solder_paste_layers = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "solder_mask"})
var solder_paste_info= solder_paste_layers.map(function(v){return v.side}).reduce(function(a,b){ var solder_paste_info= solder_paste_layers.map(function(v){return v.side}).reduce(function(a,b){
if(a.indexOf(b)<0){ a.push(b) } if(a.indexOf(b)<0){ a.push(b) }
return a return a
},[]) },[])
var res = "none" var res = "NONE"
if(solder_paste_info.length == 0){ if(solder_paste_info.length == 0){
res = "none" res = "NONE"
} else if (solder_paste_info.length == 1) { } else if (solder_paste_info.length == 1) {
res = /top/ig.test(solder_paste_info[0]) ? "top" : "bot" res = /top/ig.test(solder_paste_info[0]) ? "FRONT1" : "BACK1"
} else { } else {
res = "both" res = "FRONT1_BACK1"
} }
return res return res
} }
T_m_p.prototype.analysis_silk_screen_side = function(){ // 检查文字层所在面次 T_m_p.prototype.analysis_vc_id_print_side = function(){ // 检查文字层所在面次
var solder_mask_layers = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "solder_paste"}) var solder_mask_layers = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "solder_paste"})
var solder_mask_info= solder_mask_layers.map(function(v){return v.side}).reduce(function(a,b){ var solder_mask_info= solder_mask_layers.map(function(v){return v.side}).reduce(function(a,b){
if(a.indexOf(b)<0){ a.push(b) } if(a.indexOf(b)<0){ a.push(b) }
return a return a
},[]) },[])
var res = "none" var res = "NA"
if(solder_mask_info.length == 0){ if(solder_mask_info.length == 0){
res = "none" res = "NA"
} else if (solder_mask_info.length == 1) { } else if (solder_mask_info.length == 1) {
res = /top/ig.test(solder_mask_info[0]) ? "top" : "bot" res = /top/ig.test(solder_mask_info[0]) ? "FRONT" : "BACK"
} else { } else {
res = "both" res = "FRONT / BACK"
} }
return res return res
} }
...@@ -1054,7 +1174,7 @@ function smdAnalysis(props){ ...@@ -1054,7 +1174,7 @@ function smdAnalysis(props){
var layers = props.layers var layers = props.layers
var res = {} var res = {}
steplist.forEach(function(step){ steplist.forEach(function(step){
GEN.openStep({job:job,step:step}) GEN.openStep({job:job,name:step})
layers.forEach(function(layer){ layers.forEach(function(layer){
// 计算开窗 数量 // 计算开窗 数量
if(layer.solderL){ if(layer.solderL){
...@@ -1257,7 +1377,6 @@ function analysisChkAttr(par) { ...@@ -1257,7 +1377,6 @@ function analysisChkAttr(par) {
job: job, job: job,
step: par.step, step: par.step,
checklist: oChecklistName, checklist: oChecklistName,
units:"mm",
nact: 1, nact: 1,
attr: v + "_min_" + type attr: v + "_min_" + type
}) })
...@@ -1279,11 +1398,11 @@ function analysisDrill(par, step){ ...@@ -1279,11 +1398,11 @@ function analysisDrill(par, step){
// {"layer":"d1-2","symbol":"r3.937","start":"top","end":"isl2"} // {"layer":"d1-2","symbol":"r3.937","start":"top","end":"isl2"}
// {"layer":"d1-2","symbol":"r35.0394","start":"top","end":"bottom"} // {"layer":"d1-2","symbol":"r35.0394","start":"top","end":"bottom"}
var job = Job.toLowerCase() var job = Job.toLowerCase()
GEN.affectedLayer({affected:'no',mode:'all'})
var res = par.map(function(drill){ var res = par.map(function(drill){
GEN.affectedLayer({affected:'no',mode:'all'}) GEN.workLayer({name:drill.layer,display_number:2,clear_before:'yes'})
GEN.affectedLayer({affected:'yes',layer:drill.layer})
GEN.selClearFeature() GEN.selClearFeature()
GEN.selectByFilter({feat_types:"pad",include_syms:drill.symbol}) GEN.selectByFilter({feat_types:'pad', include_syms:drill.symbol})
if(GEN.getSelectCount()>0){ if(GEN.getSelectCount()>0){
console.log("==========================>jinru 111111111") console.log("==========================>jinru 111111111")
// 拷贝到_tmp // 拷贝到_tmp
...@@ -1337,7 +1456,7 @@ function bgaAnalysis(props){ ...@@ -1337,7 +1456,7 @@ function bgaAnalysis(props){
} }
var res = {} var res = {}
steplist.forEach(function(step){ steplist.forEach(function(step){
GEN.openStep({job:job,step:step}) GEN.openStep({job:job,name:step})
layers.forEach(function(layer){ layers.forEach(function(layer){
// 找出bga 拷贝到辅助层 // 找出bga 拷贝到辅助层
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'}) GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
...@@ -1682,4 +1801,12 @@ function createOutline(props){ ...@@ -1682,4 +1801,12 @@ function createOutline(props){
return false return false
} }
}
function has_steps(props){
var job = props.job
var pcs_step = props.pcs_step
var array_step = props.array_step
var res = GEN.getSubSteps({job:job, step:array_step})
return res.indexOf(pcs_step) >= 0
} }
\ No newline at end of file
...@@ -9,21 +9,14 @@ PARAMETER: ...@@ -9,21 +9,14 @@ PARAMETER:
name : 'path', name : 'path',
title : '资料路径', title : '资料路径',
type : 'LineEdit', type : 'LineEdit',
property : {tool_tip : '存放所有料号的文件夹路径,不需要进入到料号文件夹内'}, property : {tool_tip : '资料路径,必填'},
}, },
{ {
name : 'customer', name : 'db',
title : '客户配置', title : '料号db',
type : 'RadioBox', type : 'LineEdit',
property : { property : {tool_tip : '料号db,默认是genesis'},
item_list:[ },
{name:'customer_1',text:'customer_1'},
{name:'customer_2',text:'customer_2'},
{name:'new_data',text:'new_data'},
],
tool_tip:'客户代码'
}
},
{ {
name : 'config_path', name : 'config_path',
title : '配置地址', title : '配置地址',
...@@ -33,7 +26,7 @@ PARAMETER: ...@@ -33,7 +26,7 @@ PARAMETER:
] ]
VERSION_HISTORY: VERSION_HISTORY:
V1.00 2020-04-15 Scott Sun V1.00 2020-04-20 Scott Sun
1.新版本 1.新版本
HELP: HELP:
...@@ -54,6 +47,8 @@ PARAMETER: ...@@ -54,6 +47,8 @@ PARAMETER:
// 引入模块 包 // 引入模块 包
console.log("=============================================>input_start"); console.log("=============================================>input_start");
console.log("=============================================>input_start"); console.log("=============================================>input_start");
console.log("=============================================>input_start");
console.log("=============================================>input_start");
var $ = require('topcam.scriptfunc').argv(); var $ = require('topcam.scriptfunc').argv();
var fs = require('fs'); var fs = require('fs');
var _ = require('lodash'); var _ = require('lodash');
...@@ -71,6 +66,7 @@ if ($.conf.product_type == "aimdfm") { ...@@ -71,6 +66,7 @@ if ($.conf.product_type == "aimdfm") {
} }
var GEN = $.gen; var GEN = $.gen;
var Job = $.job_name; var Job = $.job_name;
var JobId = $.job_id;
var db = $.db; var db = $.db;
var Status = 'ok'; var Status = 'ok';
var resultData = []; var resultData = [];
...@@ -78,12 +74,36 @@ var PAR = {}; ...@@ -78,12 +74,36 @@ var PAR = {};
if ($.hasOwnProperty('script_parameter')){ if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter); PAR = JSON.parse($.script_parameter);
} }
try { try {
var par = PAR; var par = PAR;
if(!par.hasOwnProperty("customer")){throw "未填写配置"}; // var db_path = db.query("",function(q){
if(!par.hasOwnProperty("config_path")){par.config_path = "cam/input_data"}; // return q.selectValue({
// table:'pub_conf',
// field:'text_data',
// where:{path : "quote-data-upload"}
// })
// });
// if(_.isEmpty(db_path)){throw "quote-data-upload error"}
if(!par.path || par.path == "") {throw "path error"}
if(!par.hasOwnProperty("config_path") || par.config_path==""){
console.log("========================cfg");
par.config_path = "cam/input_data"
};
if(!par.hasOwnProperty("db") || par.db==""){
console.log("========================db");
par.db = "genesis"
};
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() par.customer = par.customer[0].toUpperCase()+par.customer.slice(1).toLowerCase()
var cfg = db.query("",function(q){ var cfg = db.query("",function(q){
return q.selectValue({ return q.selectValue({
...@@ -92,9 +112,7 @@ try { ...@@ -92,9 +112,7 @@ try {
where:{path : par.config_path} where:{path : par.config_path}
}) })
}); });
if (!cfg || cfg == ""){throw "cfg can not find"} if (!cfg || cfg == ""){throw "cfg can not find"}
var config = eval(cfg); var config = eval(cfg);
if(!config.hasOwnProperty("customer")){throw "config error"} if(!config.hasOwnProperty("customer")){throw "config error"}
var job = Job; var job = Job;
...@@ -103,13 +121,27 @@ try { ...@@ -103,13 +121,27 @@ try {
// 如果genesis已经存在这个料号 // 如果genesis已经存在这个料号
err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err}; err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
var custCfg = config.customer[par.customer] var custCfg = config.customer[par.customer]
if(!custCfg){throw "config error"} if(!custCfg){throw "customer config error:"+par.customer}
custCfg.db = par.db || custCfg.db
var step = custCfg.step.toLowerCase() var step = custCfg.step.toLowerCase()
// 获取路径下文件信息 // 获取路径下文件信息
var path = par.path || custCfg.path var path = par.path
var pathInfo = fs.listDir(path, 1) console.log("========= ====>path:"+ path)
if(!fs.exists(path)){throw "path error"}
var pathInfo = fs.listDir(path + "/" + db_customer.toLowerCase(), 1)
// 判断存不存在料号文件 // 判断存不存在料号文件
var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job}) var vc_position = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field:'version',
where:{id : JobId}
})
});
var job_file_baseName = job
if(vc_position && vc_position != "" && !(/null/ig.test(vc_position))){
job_file_baseName = job_file_baseName + "_" + vc_position
}
var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job_file_baseName})
if(jobFile.length == 0){throw "job file is not exist"} if(jobFile.length == 0){throw "job file is not exist"}
var jobFiles = [] // 记录要分析的文件 var jobFiles = [] // 记录要分析的文件
if (!jobFile[0].isDir) { if (!jobFile[0].isDir) {
...@@ -126,27 +158,36 @@ try { ...@@ -126,27 +158,36 @@ try {
var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob) var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob)
if(err){throw err} if(err){throw err}
} else { // 多个tgz文件 说明需要合并 } else { // 多个tgz文件 说明需要合并
var mergeFiles = jobInfo.data.filter(function(item){ console.log("==========合并的情况");
var err = importJob({name:item.file.baseName,db:custCfg.db,path:item.file.path},config.delSameJob) var jobs = jobInfo.data.map(function(item, i){
var err = importJob({name:job + "_tmp_" + i,db:custCfg.db,path:item.file.path},config.delSameJob)
if(err){throw err} if(err){throw err}
return /yes/ig.test(item.format.isMerge) return job + "_tmp_" + i
})
// 分析arr_job 和 pcs_job
jobs = jobs.map(function(jobname){
GEN.openJob({job:jobname});
var step_tmp = GEN.getStepList({job:jobname})[0]
var type = getStepType(step_tmp)
return {
jobname: jobname,
stepname: step_tmp,
type: type
}
}) })
var arr_job = mergeFiles[0]
var arr_step; var pcs_job = jobs.filter(function(v){return v.type == "pcs"})[0]
var steplist = GEN.getStepList({job:arr_job.file.baseName}) var arr_job = jobs.filter(function(v){return v.type == "arr"})[0]
if(steplist.indexOf(arr_job.format.arrStep) < 0){
arr_step = steplist[0]
}else{arr_step = arr_job.format.arrStep}
GEN.openJob({job:job});
GEN.openJob({job:arr_job.file.baseName});
GEN.copyStep({ // 合并 GEN.copyStep({ // 合并
source_job:arr_job.file.baseName, source_job:arr_job.jobname,
source_name:arr_step, source_name:arr_job.stepname,
dest_job:job, dest_job:pcs_job.jobname,
dest_name:arr_step, dest_name:arr_job.stepname,
}); });
GEN.closeJob({ job: arr_job.file.baseName }); GEN.closeJob({ job: arr_job.jobname });
GEN.deleteJob({ job: arr_job.file.baseName }); // 合并后 删除array的料号 GEN.deleteJob({ job: arr_job.jobname }); // 合并后 删除array的料号
// 修改pcs料号名称
GEN.COM("rename_entity,job=,is_fw=no,type=job,fw_type=form,name="+pcs_job.jobname+",new_name="+job)
} }
importOk = true importOk = true
} }
...@@ -175,7 +216,7 @@ try { ...@@ -175,7 +216,7 @@ try {
if(!importOk){throw "import error"} if(!importOk){throw "import error"}
// 导入结束 // 导入结束
var matrix = GEN.getMatrix({job:job}); var matrix = GEN.getMatrix({job:job});
comp = Object.keys(matrix).filter(function(v){ // 如果有comp层 删除 comp = Object.keys(matrix).filter(function(v){ // 如果有comp层 删除
return /^comp_\+_/ig.test(v) return /^comp_\+_/ig.test(v)
}) })
...@@ -224,7 +265,9 @@ catch (e) { ...@@ -224,7 +265,9 @@ catch (e) {
function delSameJob(props){ function delSameJob(props){
var job = props.job var job = props.job
var delSame = props.delSame var delSame = props.delSame
console.log("======================>delsame:"+ delSame);
if(GEN.isJobExists({job:job})){ if(GEN.isJobExists({job:job})){
if(/^yes$/ig.test(delSame)){ if(/^yes$/ig.test(delSame)){
if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) } if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
...@@ -302,4 +345,12 @@ function importJob(props,delSameJob){ ...@@ -302,4 +345,12 @@ function importJob(props,delSameJob){
GEN.importJob(props); GEN.importJob(props);
} }
function getStepType(step){
if(/pcs|cad|orig/ig.test(step)){
return "pcs"
}
if(/stp|arr/ig.test(step)){
return "arr"
}
return pcs
}
...@@ -62,7 +62,7 @@ try { ...@@ -62,7 +62,7 @@ try {
var mode = "use" // develop var mode = "use" // develop
var par = PAR; var par = PAR;
if(!par.hasOwnProperty("config_path") || par.config_path==""){ if(!par.hasOwnProperty("config_path") || par.config_path==""){
console.log("========================cfg"); console.log("==============cfg");
par.config_path = "cam/input_data" par.config_path = "cam/input_data"
}; };
var db_customer = db.query("",function(q){ var db_customer = db.query("",function(q){
...@@ -92,7 +92,6 @@ try { ...@@ -92,7 +92,6 @@ try {
var custCfg = config.customer[par.customer] // 获取客户配置 var custCfg = config.customer[par.customer] // 获取客户配置
if(!custCfg){throw "config error"} if(!custCfg){throw "config error"}
var step = custCfg.step.toLowerCase() // 获取pcs_step
// 料号验证 // 料号验证
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" } if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})} if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
...@@ -292,10 +291,12 @@ function setDrill(props){ // 设置钻孔 ...@@ -292,10 +291,12 @@ function setDrill(props){ // 设置钻孔
return v.attr.type == "signal" && v.attr.context == "board" return v.attr.type == "signal" && v.attr.context == "board"
}) })
console.log("=================>setdrill:drillLayer:" + _.toString(drillLayer)); console.log("=================>setdrill:drillLayer:" + _.toString(drillLayer));
console.log("=================>setdrill:signalLayer:" + _.toString(signalLayer));
var layerCount = GEN.getLayerCount({job:job}) var layerCount = GEN.getLayerCount({job:job})
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2 // findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
function findSignal(num){ function findSignal(num){
console.log(num)
return signalLayer[Number(num-1)].name return signalLayer[Number(num-1)].name
} }
function doDrill(drills){ // 分析钻孔层 function doDrill(drills){ // 分析钻孔层
......
...@@ -419,9 +419,8 @@ ...@@ -419,9 +419,8 @@
{"orig_name" : "fab.art", "tl_name" : "fab.art" }, {"orig_name" : "fab.art", "tl_name" : "fab.art" },
{"orig_name" : ["multipack.art","^array$"], "tl_name" : "array" }, {"orig_name" : ["multipack.art","^array$"], "tl_name" : "array" },
{"orig_name" : ["^outline"], "tl_name" : "outline" }, {"orig_name" : ["^outline"], "tl_name" : "outline" },
{"orig_name" : "top-enig", "tl_name" : "top-enig" }, {"orig_name" : ["top-enig","top_enig"], "tl_name" : "top_enig" },
{"orig_name" : "bot-enig", "tl_name" : "bot-enig" }, {"orig_name" : ["bot-enig","bot_enig"], "tl_name" : "bot_enig" },
{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
] ]
}, },
"New_data": { "New_data": {
...@@ -549,7 +548,7 @@ ...@@ -549,7 +548,7 @@
} }
}, },
"data_format": [ "data_format": [
{"tl_name":"top_enig" , "new_name":"top_enig" , "attr":{ "context":"board", "type":"mixed" }}, {"tl_name":"top_enig" , "new_name":"top_enig" , "attr":{ "context":"board", "type":"document" }},
{"tl_name":"past_top" , "new_name":"past_top" , "attr":{ "context":"board", "type":"solder_paste" }}, {"tl_name":"past_top" , "new_name":"past_top" , "attr":{ "context":"board", "type":"solder_paste" }},
{"tl_name":"silk_top" , "new_name":"silk_top" , "attr":{ "context":"board", "type":"silk_screen" }}, {"tl_name":"silk_top" , "new_name":"silk_top" , "attr":{ "context":"board", "type":"silk_screen" }},
{"tl_name":"sm_top" , "new_name":"sm_top" , "attr":{ "context":"board", "type":"solder_mask" }}, {"tl_name":"sm_top" , "new_name":"sm_top" , "attr":{ "context":"board", "type":"solder_mask" }},
...@@ -559,7 +558,7 @@ ...@@ -559,7 +558,7 @@
{"tl_name":"sm_botm" , "new_name":"sm_botm" , "attr":{ "context":"board", "type":"solder_mask" }}, {"tl_name":"sm_botm" , "new_name":"sm_botm" , "attr":{ "context":"board", "type":"solder_mask" }},
{"tl_name":"silk_bot" , "new_name":"silk_bot" , "attr":{ "context":"board", "type":"silk_screen" }}, {"tl_name":"silk_bot" , "new_name":"silk_bot" , "attr":{ "context":"board", "type":"silk_screen" }},
{"tl_name":"past_botm" , "new_name":"past_botm" , "attr":{ "context":"board", "type":"solder_paste" }}, {"tl_name":"past_botm" , "new_name":"past_botm" , "attr":{ "context":"board", "type":"solder_paste" }},
{"tl_name":"bot_enig" , "new_name":"bot_enig" , "attr":{ "context":"board", "type":"mixed" }}, {"tl_name":"bot_enig" , "new_name":"bot_enig" , "attr":{ "context":"board", "type":"document" }},
{"tl_name":"d_(\\d+)-(\\d+)","new_name":"d($1)-($2)" ,"attr":{"context":"board","type":"drill"}}, {"tl_name":"d_(\\d+)-(\\d+)","new_name":"d($1)-($2)" ,"attr":{"context":"board","type":"drill"}},
{"tl_name":"drill","new_name":"drill" ,"attr":{"context":"board","type":"drill"}}, {"tl_name":"drill","new_name":"drill" ,"attr":{"context":"board","type":"drill"}},
{"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}}, {"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}},
......
...@@ -54,43 +54,7 @@ if ($.hasOwnProperty('script_parameter')){ ...@@ -54,43 +54,7 @@ if ($.hasOwnProperty('script_parameter')){
} }
try { try {
var job = Job;
if(_.isEmpty(job)) throw "没有传入料号名!";
job = job.toLowerCase()
// 料号验证
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
var matrix = GEN.getMatrix({job:job})
var signalLayers = Object.keys(matrix).filter(function(v){
var val = matrix[v]
return val.layer_type == "signal" && val.context == "board"
})
var step = "cad"
GEN.openStep({job:job, name:step})
var copper_percent_pcs = signalLayers.map(function(v){
var tmp = {layer:v}
tmp.card_copper_distribution = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
console.log("==================================>card copper_percent_pcs:"+_.toString(copper_percent_pcs))
var arr_step = "stp"
GEN.openStep({job:job, name:arr_step})
var copper_percent_stp = signalLayers.map(function(v){
var tmp = {layer:v}
tmp.array_copper_distribution = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
console.log("==================================>card copper_percent_stp:"+_.toString(copper_percent_stp))
QDfm.updateRow({ QDfm.updateRow({
table: "pdm_aimdfm_task", table: "pdm_aimdfm_task",
data: { data: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment