Commit 5352543e authored by Scott Sun's avatar Scott Sun

s

parent d340fef7
......@@ -82,8 +82,6 @@ try {
console.log("=============================================>anaysis_start");
var par = PAR;
if(par.erf == ""){delete PAR.erf}
// if(par.erf == ""){par.erf = "GBM_0.50z"}
if(_.isEmpty(Job)) throw "没有传入料号名!";
var job = Job.toLowerCase();
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
......@@ -132,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()
console.log("===================>steplist:"+_.toString(step_list))
if(step_list.indexOf(pcs_step)<0){throw "can not find pcsstep"}
......@@ -158,6 +262,70 @@ 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){
......@@ -171,11 +339,12 @@ try {
var config = {
jobInfo: {
layer_count: ["signal","power_ground"], // Board属性的signal或者power_ground层
vc_card_size_w: {api:"vc_card_size", props:"xsize"}, // 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_l: {api:"vc_array_size", props:"ysize"}, // ! array长边尺寸 需要arr_step // ? 保留小数
pcs_size_x: {api:"vc_card_size", props:"xsize"}, // card短边尺寸 // ? 保留小数
pcs_size_y: {api:"vc_card_size", props:"ysize"}, // card长边尺寸 // ? 保留小数
array_size_x: {api:"vc_array_size", props:"xsize"}, // ! 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
pcs_count_on_array: true,
stack_vias_number: true, // 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
......@@ -183,7 +352,7 @@ try {
laser_via_on_buried_hole: true, // via孔在埋孔上时,存yes
milling_bit_size: true, // todo 检查array中pcs的最小间距值
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
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
// vc_src_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层
......@@ -255,7 +424,7 @@ try {
GEN.COM('sredit_reduce_nesting,mode=one_highest')
drill_info[step] = drill_info[step] || {};
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
})
GEN.closeStep()
......@@ -269,27 +438,36 @@ try {
var tool = pcs_tool_manager[layer][key];
var array_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 = {
job_id: JobId,
layer_name: layer,
layer_name: layer_name,
tool_num: key,
tool_flag: key,
tool_type: tool.shape,
drill_type:tool.type,
drill_size : tool.drill_size,
drill_slot_length: tool.slot_len,
finish_size : tool.finish_size,
drill_type:drill_type,
// drill_size : tool.drill_size,
// drill_slot_length: tool.slot_len,
finish_size : finish_size.toFixed(3),
finish_slot_length: tool.slot_len,
size_tol_lower: tool.min_tol,
size_tol_upper: tool.max_tol,
// size_tol_lower: tool.min_tol,
// size_tol_upper: tool.max_tol,
pcs_count: tool.count,
array_count: array_count, // todo
attr_data: {} // {"allowance": 2, "org_layer_name": "hhhh"}
array_count: array_count,
attr_data: {"org_layer_name":layer} // {"allowance": 2, "org_layer_name": "hhhh"}
}
if(!array_count){delete data.array_count}
var id = db.query("",function(q){
return q.selectValue({
table:'pdm_job_cam_drill',
table:'pdm_job_cam_drill',
field:"id",
where:{job_id:JobId, layer_name: layer,tool_num: key}
})
......@@ -316,29 +494,27 @@ try {
})
})
console.log("=============================> 6 set smd bga")
var allStep = GEN.getStepList({job:job})
allStep.forEach(function(step){
GEN.openStep({job:job,name:step})
GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd")
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_user_name")
GEN.COM("get_job_path,job="+job)
GEN.COM("disp_on")
GEN.COM("origin_on")
GEN.COM("chklist_cnf_act,chklist=valor_cleanup_set_smd,nact=1,cnf=no")
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("skip_next_pre_hook")
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("get_user_name")
GEN.COM("skip_current_command")
GEN.COM("disp_on")
GEN.COM("origin_on")
GEN.COM("show_tab,tab=Checklists,show=no")
GEN.closeStep()
})
// console.log("=============================> 6 set smd bga")
// var allStep = GEN.getStepList({job:job})
// allStep.forEach(function(step){
// GEN.openStep({job:job,name:step})
// GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd")
// 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_user_name")
// GEN.COM("get_job_path,job="+job)
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("chklist_cnf_act,chklist=valor_cleanup_set_smd,nact=1,cnf=no")
// GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
// GEN.COM("skip_next_pre_hook")
// GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
// GEN.COM("get_user_name")
// GEN.COM("skip_current_command")
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("show_tab,tab=Checklists,show=no")
// GEN.closeStep()
// })
// GEN.createChklist()
......@@ -437,7 +613,7 @@ try {
stepList.forEach(function(step){
GEN.openStep({ job: job, name: step })
// 曝光
// 曝光
analysis_obj.matrixInfo.mOuters.forEach(function(item){
if(ALL.gold_fingers.length>0){
var tmp_gold_info = {}
......@@ -482,6 +658,36 @@ try {
})
GEN.clearLayers()
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存在先删除
if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) {
GEN.COM("chklist_delete", { chklist: oChecklistName })
......@@ -513,34 +719,6 @@ try {
console.log("==================================> 11 signals analysis")
// signal层分析结果
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){
var val = res[key]
......@@ -551,7 +729,6 @@ try {
})
})
GEN.closeStep()
})
......@@ -852,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){
var job = props.job || Job;
var jobId = props.jobId || JobId;
......@@ -902,6 +1118,16 @@ function analysis(props){
}
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孔连续叠加的层数
var t = this;
var res;
......@@ -1211,7 +1437,7 @@ function smdAnalysis(props){
var min_smd_pitch = smdPitch({job:job,step:step,layer:tmp_layer}) // 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){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
......@@ -1224,8 +1450,8 @@ function smdAnalysis(props){
GEN.workLayer({name:solderL_tmp,display_number:2,clear_before:"yes"})
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step})
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_length"]){res[layer.signalL].min_smd_opening_length = symbolInfo_solder["min_length"]}
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_sm_length = symbolInfo_solder["min_length"]}
GEN.deleteLayer({job:job,layer:solderL_tmp})
}
GEN.deleteLayer({job:job,layer:tmp_layer})
......@@ -1809,4 +2035,5 @@ function has_steps(props){
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
}
......@@ -74,6 +74,7 @@ var db = $.db;
var Status = 'ok';
var resultData = [];
var PAR = {};
var ALL = {}
if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
......@@ -100,7 +101,6 @@ try {
}
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
GEN.openStep({job:job, name:pcs_step})
GEN.units({type:"mm"})
_.values(matrix).forEach(function(v){
if(v.context == "board" && v.layer_type == "drill"){
if(v.type == "laser_drill"){
......@@ -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()
var config = {
jobInfo: {
......@@ -166,23 +175,24 @@ try {
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_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_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_routing: {api:"layer_exist", props:"depth_routing"}, // tmp yes|no :存在depth_routing 层时,,存yes
laser_via_on_buried_hole: true, // todo via孔在埋孔上时,存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
laser_via_on_buried_hole: true, // via孔在埋孔上时,存yes
milling_bit_size: true, // todo 检查array中pcs的最小间距值
milling_length: true, // todo 检查array中铣切长度
vc_src_01005_pad_result: {api:"board_has_attr", props:"01005_pad"}, // * yes|no:board 层中检查存在01005属性物件时,存yes 这里先拿.smd代替了
ATS_technology_25dc: {api:"layer_exist", props:"cavity"}, // yes|no:存在cavity层别时存yes
ATS_technology_25dr: {api:"layer_exist", props:"cavity"}, // yes|no:存在cavity层别时存yes
vc_src_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层
vc_src_01005_pad_result: {api:"board_has_attr", props:"01005_pad"},
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
// 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 检查线路外形处物件的长度
glod_finger: true, // todo yes|no:暂无逻辑
glod_finger_area: true, // todo 暂无逻辑
solder_mask_side: true, // top|bot|both:检查防焊层所在面次 solder_mask_side
silk_screen_side: true, // top|bot|both:检查文字层所在面次
gold_finger: true, //
glod_finger_area: true, //
ATS_sm_side: true, // top|bot|both:检查防焊层所在面次 ATS_sm_side
vc_id_print_side: true, // top|bot|both:检查文字层所在面次 vc_id_print_side
min_drl_size: true, // todo 0.5mm 最小圆孔
max_pth_drl_size: true, // todo 3.5mm 最大pth圆孔
max_npth_drl_size: true, // todo 6.0mm 最大npth圆孔
......@@ -306,39 +316,26 @@ try {
})
})
console.log("=============================> 6 set smd bga")
var allStep = GEN.getStepList({job:job})
allStep.forEach(function(step){
GEN.openStep({job:job,name:step})
console.log(3)
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")
console.log(5)
GEN.COM("get_user_name")
console.log(6)
GEN.COM("get_job_path,job="+job)
console.log(7)
GEN.COM("disp_on")
console.log(8)
GEN.COM("origin_on")
console.log(9)
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")
console.log(11)
GEN.COM("skip_next_pre_hook")
console.log(12)
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
console.log(13)
GEN.COM("get_user_name")
console.log(14)
GEN.COM("skip_current_command")
console.log(15)
GEN.COM("disp_on")
console.log(16)
GEN.COM("origin_on")
console.log(17)
GEN.COM("show_tab,tab=Checklists,show=no")
GEN.closeStep()
})
......@@ -390,6 +387,42 @@ try {
var oChecklistName = "mychecklist"
var signalLayers = analysis_obj.matrixInfo.mSignals.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 = {
min_line_width: ["line","user_nor_line"],
min_line_spacing: ["l2l"],
......@@ -403,8 +436,30 @@ try {
})
stepList.forEach(function(step){
GEN.openStep({ job: job, name: step })
// 曝光
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){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL})
// {"area":"0.73817","percent":"8.986"}
......@@ -459,6 +514,7 @@ try {
// signal层分析结果
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})
......@@ -467,26 +523,14 @@ try {
if(b.pad!="0"){
a.push(b.symbol)
}
return a
return a
},[])[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")
var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果
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
})
})
console.log("===============drillRes:" + _.toString(drillRes));
drillRes.forEach(function(item){
save_layerinfo({
jobid: JobId,
......@@ -497,25 +541,18 @@ try {
}
})
})
// 铜面积
console.log("=============================> 13 save copper_percent")
var copper_percent_pcs = 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_pcs));
GEN.closeStep()
copper_percent_pcs.forEach(function(item){
// 数据入库
Object.keys(res).forEach(function(key){
var val = res[key]
save_layerinfo({
jobid: JobId,
layer: item.layer,
layerinfohash: {
copper_percent: item.copper_percent
}
layer: key,
layerinfohash: val
})
})
GEN.closeStep()
})
// 保存
......@@ -784,32 +821,34 @@ function save_layerinfo(props){ // 保存层信息
var layerinfohash = props.layerinfohash;
Object.keys(layerinfohash).forEach(function(key){
var val = layerinfohash[key];
var value = db.query("",function(q){
return q.selectValue({
table:'pdm_job_layerattr',
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},
if(val && val != ""){
var value = db.query("",function(q){
return q.selectValue({
table:'pdm_job_layerattr',
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},
})
});
}
}
})
}
......@@ -854,6 +893,13 @@ function analysis(props){
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){ //
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孔连续叠加的层数
......@@ -931,11 +977,67 @@ function analysis(props){
t.jobInfo.laser_info = laser_info;
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
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
return "_todo"
T_m_p.prototype.analysis_laser_via_on_buried_hole = function(){ // via孔在埋孔上
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
return "_todo"
......@@ -984,41 +1086,59 @@ function analysis(props){
T_m_p.prototype.analysis_edge_plating_length = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_glod_finger = function(){ // todo
return "_todo"
T_m_p.prototype.analysis_gold_finger = function(){ //
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"
}
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_info= solder_paste_layers.map(function(v){return v.side}).reduce(function(a,b){
if(a.indexOf(b)<0){ a.push(b) }
return a
},[])
var res = "none"
var res = "NONE"
if(solder_paste_info.length == 0){
res = "none"
res = "NONE"
} 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 {
res = "both"
res = "FRONT1_BACK1"
}
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_info= solder_mask_layers.map(function(v){return v.side}).reduce(function(a,b){
if(a.indexOf(b)<0){ a.push(b) }
return a
},[])
var res = "none"
var res = "NA"
if(solder_mask_info.length == 0){
res = "none"
res = "NA"
} 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 {
res = "both"
res = "FRONT / BACK"
}
return res
}
......@@ -1054,7 +1174,7 @@ function smdAnalysis(props){
var layers = props.layers
var res = {}
steplist.forEach(function(step){
GEN.openStep({job:job,step:step})
GEN.openStep({job:job,name:step})
layers.forEach(function(layer){
// 计算开窗 数量
if(layer.solderL){
......@@ -1257,7 +1377,6 @@ function analysisChkAttr(par) {
job: job,
step: par.step,
checklist: oChecklistName,
units:"mm",
nact: 1,
attr: v + "_min_" + type
})
......@@ -1279,11 +1398,11 @@ function analysisDrill(par, step){
// {"layer":"d1-2","symbol":"r3.937","start":"top","end":"isl2"}
// {"layer":"d1-2","symbol":"r35.0394","start":"top","end":"bottom"}
var job = Job.toLowerCase()
GEN.affectedLayer({affected:'no',mode:'all'})
var res = par.map(function(drill){
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.affectedLayer({affected:'yes',layer:drill.layer})
GEN.workLayer({name:drill.layer,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({feat_types:"pad",include_syms:drill.symbol})
GEN.selectByFilter({feat_types:'pad', include_syms:drill.symbol})
if(GEN.getSelectCount()>0){
console.log("==========================>jinru 111111111")
// 拷贝到_tmp
......@@ -1337,7 +1456,7 @@ function bgaAnalysis(props){
}
var res = {}
steplist.forEach(function(step){
GEN.openStep({job:job,step:step})
GEN.openStep({job:job,name:step})
layers.forEach(function(layer){
// 找出bga 拷贝到辅助层
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
......@@ -1682,4 +1801,12 @@ function createOutline(props){
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
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