Commit 472698f3 authored by Scott Sun's avatar Scott Sun

s

parent b9d75c41
...@@ -90,14 +90,75 @@ try { ...@@ -90,14 +90,75 @@ try {
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"}); GEN.checkInout({job:job,mode:"out"});
var pcs_step = par.pcs_step == "" ? "cad" : par.pcs_step; var pcs_step = par.pcs_step == "" ? "cad" : par.pcs_step;
var array_step = par.array_step == "" ? "stp" : par.pcs_step; var array_step = par.array_step == "" ? "stp" : par.array_step;
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
var step_list = GEN.getStepList({job:job}) var step_list = GEN.getStepList({job:job})
if(step_list.indexOf(array_step)<0){
array_step = false
}
if(step_list.indexOf(pcs_step)<0){
pcs_step = step_list[0]
}
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
GEN.openStep({job:job, name:pcs_step})
_.values(matrix).forEach(function(v){
if(v.context == "board" && v.layer_type == "drill"){
if(v.type == "laser_drill"){
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selAllFeat()
if(GEN.getSelectCount()>0){
GEN.COM("cur_atr_set,attribute=.drill,option=via")
GEN.COM("sel_change_atr,mode=add")
}
GEN.clearLayers()
GEN.selClearFeature()
} else if(v.type == "main_drill" || v.type == "blind_drill" || v.type == "bury_drill") {
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:v.drl_start,use:'filter',mode:'touch',f_types:"pad"})
GEN.selRefFeat({layers:v.drl_end,use:'filter',mode:'touch',f_types:"pad"})
if(GEN.getSelectCount()>0){
GEN.COM("cur_atr_set,attribute=.drill,option=plated")
GEN.COM("sel_change_atr,mode=add")
}
GEN.selReverse()
if(GEN.getSelectCount() > 0){
GEN.COM("cur_atr_set,attribute=.drill,option=non_plated")
GEN.COM("sel_change_atr,mode=add")
}
}
}
})
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"}
if(step_list.indexOf(array_step)<0){array_step = false} if(step_list.indexOf(array_step)<0){array_step = false}
console.log("===================================> 1matrix") console.log("=============== ====================> 1matrix")
var analysis_obj = analysis({job:job,jobId:JobId,pcs_step:pcs_step,array_step:array_step,matrix:matrix}) var analysis_obj = analysis({job:job,jobId:JobId,pcs_step:pcs_step,array_step:array_step,matrix:matrix})
// 创建profile
var tmp_matrix = GEN.getMatrix({job:job})
var board_layer = Object.keys(tmp_matrix).filter(function(v){
return tmp_matrix[v].context == "board"
})
GEN.openStep({job:job, name:pcs_step})
var now_profile = GEN.getProfile({job:job, step:pcs_step})
console.log("profile:===============>"+now_profile);
console.log(now_profile.match(/\n/ig).length);
if(now_profile.match(/\n/ig).length == 1){ // 如果没有profile
createOutline({job:job, step:pcs_step, matrix: tmp_matrix})
} else {
GEN.affectedLayer({affected:'yes',layer: board_layer, clear_before:"yes"})
GEN.selectByFilter({profile:"out"})
if(GEN.getSelectCount() > 0){
GEN.selDelete()
}
}
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层
...@@ -113,14 +174,14 @@ try { ...@@ -113,14 +174,14 @@ try {
laser_via_on_buried_hole: true, // todo via孔在埋孔上时,存yes laser_via_on_buried_hole: true, // todo 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:".smd"}, // * yes|no:board 层中检查存在01005属性物件时,存yes 这里先拿.smd代替了 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_25dc: {api:"layer_exist", props:"cavity"}, // yes|no:存在cavity层别时存yes
ATS_technology_25dr: {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_EDGE_PLATING: true, // yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层
edge_plating_length: true, // todo 检查线路外形处物件的长度 edge_plating_length: true, // todo 检查线路外形处物件的长度
glod_finger: true, // todo yes|no:暂无逻辑 glod_finger: true, // todo yes|no:暂无逻辑
glod_finger_area: true, // todo 暂无逻辑 glod_finger_area: true, // todo 暂无逻辑
solder_mask_side: true, // top|bot|both:检查防焊层所在面次 solder_mask_side: true, // top|bot|both:检查防焊层所在面次 solder_mask_side
silk_screen_side: true, // top|bot|both:检查文字层所在面次 silk_screen_side: true, // top|bot|both:检查文字层所在面次
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圆孔
...@@ -130,12 +191,9 @@ try { ...@@ -130,12 +191,9 @@ try {
max_slot_drl_length: true, // todo 2.0mm 最大槽孔 max_slot_drl_length: true, // todo 2.0mm 最大槽孔
max_spec_slot_drl_size: true, // todo 2.1mm 最大异形槽孔 max_spec_slot_drl_size: true, // todo 2.1mm 最大异形槽孔
max_spec_slot_drl_length: true, // todo 3.0mm 最大异形槽孔 max_spec_slot_drl_length: true, // todo 3.0mm 最大异形槽孔
},
layerInfo: {
} }
} }
console.log("===================================> 2analysis_obj") console.log("===============================> 2analysis_obj")
// 分析料号info // 分析料号info
var jobInfo = {} var jobInfo = {}
...@@ -175,17 +233,24 @@ try { ...@@ -175,17 +233,24 @@ try {
}) })
console.log("===================================> 5 save drill info") console.log("===================================> 5 save drill info")
// todo 设置钻孔层孔属性,镭射孔via,无铜孔npth,其余孔pth
// 获取pcs_step 和 array_step的钻孔信息 // 获取pcs_step 和 array_step的钻孔信息
var drill_info = {}; var drill_info = {};
var drillLayers = analysis_obj.matrixInfo.mDrills; var drillLayers = analysis_obj.matrixInfo.mDrills;
[pcs_step, array_step].forEach(function(step){ [pcs_step, array_step].forEach(function(step){
drill_info[step] = drill_info[step] || {}; if(step){
drillLayers.forEach(function(layer){ var tmp_step = step + "_tmp"
var layer_tool_manager = GEN.getTool({job:job, step:step,layer:layer.name}) GEN.matrixCopyStep({job:job,step:tmp_step,step:tmp_step})
drill_info[step][layer.name] = layer_tool_manager GEN.COM("copy_entity",{type:"step",source_job:job,source_name:step,dest_job:job,dest_name:tmp_step})
}) GEN.openStep({job:job, name: tmp_step})
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})
drill_info[step][layer.name] = layer_tool_manager
})
GEN.closeStep()
GEN.deleteStep({job:job,step:tmp_step})
}
}) })
var pcs_tool_manager = drill_info[pcs_step]; var pcs_tool_manager = drill_info[pcs_step];
var array_tool_manager = drill_info[array_step]; var array_tool_manager = drill_info[array_step];
...@@ -241,8 +306,26 @@ try { ...@@ -241,8 +306,26 @@ try {
}) })
}) })
console.log("===================================> 6 smd info") console.log("=========== ===================> 6 set smd bga")
var hasattrs = [".smd",".bga"]
var ishasattrs = hasattrs.reduce(function(a,b){ // 判断是否含有.smd属性
if(!hasAttr({job:job,step:pcs_step,attr:b,layers:analysis_obj.matrixInfo.mOuters})){ a = false }
return a
},true)
if(!ishasattrs){ // 如果找不到.smd 分析.smd
GEN.COM("chklist_single,action=valor_cleanup_set_smd,show=yes")
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_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("chklist_close,chklist=valor_cleanup_set_smd,mode=hide")
}
// GEN.createChklist()
console.log("============= ===============> 6 analysis smd")
// smd // smd
var smdInfo; var smdInfo;
try { try {
...@@ -250,24 +333,21 @@ try { ...@@ -250,24 +333,21 @@ try {
smdInfo = smdAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".smd"}) smdInfo = smdAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".smd"})
} catch (msg) { } catch (msg) {
console.log("smdInfo:error:"+msg) console.log("smdInfo:error:"+msg)
smdInfo = {}
} }
// bga // bga
console.log("===================================> 7 bga info") console.log("===================================> 7 bga info")
var bgaInfo; var bgaInfo;
try { // try {
if(!analysis_obj.matrixInfo.mOuters[0].solderL){throw "no mask"} bgaInfo = bgaAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".bga"})
bgaInfo = bgaAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".bga"}) // } catch (msg) {
} catch (msg) { // console.log("bgaInfo:error:"+msg)
console.log("bgaInfo:error:"+msg) // }
bgaInfo = {} console.log("========================bgaInfo:" + _.toString(bgaInfo));
}
if(JSON.stringify(bgaInfo) == "{}"){
console.log("can not find .bga attr")
}
// 保存 // 保存
console.log("===================================> 8 save bga smd info") console.log("============== =====================> 8 save bga smd info")
var save_info = [smdInfo, analysis_obj.jobInfo.laser_info,bgaInfo]; // 保存 smd 和 bga数据 var save_info = [smdInfo, analysis_obj.jobInfo.laser_info,bgaInfo]; // 保存 smd 和 bga数据
save_info.forEach(function(item){ save_info.forEach(function(item){
if(JSON.stringify(item)!= "{}" && item){ if(JSON.stringify(item)!= "{}" && item){
...@@ -281,21 +361,25 @@ try { ...@@ -281,21 +361,25 @@ try {
}) })
} }
}) })
console.log("===================================> 9 copper_percent signal drill")
console.log("================================> 9 copper_percent signal drill")
// 分析layer info // 分析layer info
var stepList = [pcs_step]; var stepList = [pcs_step];
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})
var info = { var info = {
min_line_width: ["line"], min_line_width: ["line","user_nor_line"],
min_line_spacing: ["l2l"], min_line_spacing: ["l2l"],
min_line2pad: ["p2line"], min_line2pad: ["p2line"],
min_pad2pad: ["p2p", "smd2smd", "smd2pad"], min_pad2pad: ["p2p", "smd2smd", "smd2pad"],
min_ar: ["ar","pth_ar"] min_ar: ["ar","pth_ar"]
} }
save_job_info({
jobid: JobId,
jobinfohash: {ATS_surface_area_base_on:"Card"}
})
stepList.forEach(function(step){ stepList.forEach(function(step){
GEN.openStep({ job: job, name: step }) GEN.openStep({ job: job, name: step })
// 曝光 // 曝光
...@@ -304,14 +388,20 @@ try { ...@@ -304,14 +388,20 @@ try {
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"}
var tmp_area = tmp_info.area var tmp_area = tmp_info.area
var tmp_percent = tmp_info.percent + "%" var tmp_percent = tmp_info.percent;
// save_layerinfo({ var tmp_data = /top/ig.test(item.signalL) ? {carbon_Area_front:tmp_area} : {carbon_Area_back:tmp_area}
// jobid: JobId, save_job_info({
// layer: item.signalL, jobid: JobId,
// layerinfohash: { jobinfohash: tmp_data
})
// } save_layerinfo({
// }) jobid: JobId,
layer: item.signalL,
layerinfohash: {
ref_layer: item.solderL,
exposed_area: tmp_percent
}
})
} }
}) })
GEN.clearLayers() GEN.clearLayers()
...@@ -344,7 +434,7 @@ try { ...@@ -344,7 +434,7 @@ try {
layers: signalLayers, layers: signalLayers,
items: [tmpitem] items: [tmpitem]
}) })
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})
...@@ -382,39 +472,25 @@ try { ...@@ -382,39 +472,25 @@ try {
}) })
}) })
// 铜面积 // 铜面积
console.log("===================================> 13 save copper_percent") console.log("=============================> 13 save copper_percent")
// 创建profile // 创建profile
var new_martix = GEN.getMatrix({job:job}) var copper_percent_pcs = signalLayers.map(function(v){
var profileLayer = Object.keys(new_martix).filter(function(v){ var tmp = {layer:v}
return new_martix[v].layer_type=="rout" && new_martix[v].context == "board" tmp.copper_percent = GEN.copperArea({layer1:v}).percent + "%"
return tmp
}) })
if(profileLayer.length){ console.log("================ ==signalLayers============"+_.toString(signalLayers));
var tmp = profileLayer[0] console.log(_.toString(copper_percent_pcs));
if(profileLayer.indexOf("outline")>=0){tmp = "outline"} GEN.closeStep()
GEN.openStep({job:job,name:pcs_step}) copper_percent_pcs.forEach(function(item){
GEN.workLayer({name:tmp,display_number:2,clear_before:'yes'}) save_layerinfo({
GEN.selAllFeat(); jobid: JobId,
var count = GEN.getSelectCount() layer: item.layer,
if(count > 0){ layerinfohash: {
GEN.selCreateProfile() copper_percent: item.copper_percent
GEN.selClearFeature() }
}
GEN.closeStep()
var copper_percent_pcs = signalLayers.map(function(v){
var tmp = {layer:v}
tmp.copper_percent = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
copper_percent_pcs.forEach(function(item){
save_layerinfo({
jobid: JobId,
layer: item.layer,
layerinfohash: {
copper_percent: item.copper_percent
}
})
}) })
} })
}) })
// 保存 // 保存
...@@ -452,7 +528,7 @@ try { ...@@ -452,7 +528,7 @@ try {
} }
catch (e) { catch (e) {
Status = 'error'; Status = 'error';
console.log("====================================>error"); console.log("==================== ============>error");
console.log(_.toString(e)); console.log(_.toString(e));
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]}); resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return {status: Status, result_data: resultData}; return {status: Status, result_data: resultData};
...@@ -530,33 +606,23 @@ function ANALYSIS_STACKUP(props){ ...@@ -530,33 +606,23 @@ function ANALYSIS_STACKUP(props){
layer.drl_to_num = layer_count; layer.drl_to_num = layer_count;
layer.type = 'main_drill'; layer.type = 'main_drill';
} }
else if (/^d_(\d+)\-(\d+)$/.test(layer.odb_name)){ else if (/^d(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name) var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1]; var drl_star = tmp[1];
var drl_end = tmp[2]; var drl_end = tmp[2];
layer.name = 'drill' + drl_star + '-' + drl_end; layer.name = 'd' + drl_star + '-' + drl_end;
layer.drl_start_num = drl_star; layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end; layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star; layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end; layer.drl_to_num = drl_end;
if( drl_star == 1 || drl_end == layer_count ){ if(drl_end - drl_star == 1){
layer.type = 'laser_drill'; // 镭射
} else if( drl_star == 1 || drl_end == layer_count ){
layer.type = 'blind_drill'; // 埋孔 layer.type = 'blind_drill'; // 埋孔
} } else{
else{
layer.type = 'bury_drill'; // 盲孔 layer.type = 'bury_drill'; // 盲孔
} }
} }
else if (/^d(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'd'+drl_star+'-'+drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
layer.type = 'laser_drill'; // 镭射孔
}
else if (/\-a$/.test(layer.odb_name)){ else if (/\-a$/.test(layer.odb_name)){
layer.side = 'top'; layer.side = 'top';
if(!layer.name){ if(!layer.name){
...@@ -649,7 +715,7 @@ function selCopyLayer(props){ // 拷贝选择的到辅助层 ...@@ -649,7 +715,7 @@ function selCopyLayer(props){ // 拷贝选择的到辅助层
} }
GEN.selCopyOther({dest:'layer_name',target_layer:layer}) GEN.selCopyOther({dest:'layer_name',target_layer:layer})
} }
function save_job_info(props){ // todo 保存料号信息 function save_job_info(props){ // 保存料号信息
var jobid = props.jobid; var jobid = props.jobid;
var jobinfohash = props.jobinfohash; var jobinfohash = props.jobinfohash;
Object.keys(jobinfohash).forEach(function(key){ Object.keys(jobinfohash).forEach(function(key){
...@@ -682,11 +748,13 @@ function save_job_info(props){ // todo 保存料号信息 ...@@ -682,11 +748,13 @@ function save_job_info(props){ // todo 保存料号信息
} }
}) })
} }
function save_layerinfo(props){ // todo 保存层信息 function save_layerinfo(props){ // 保存层信息
var jobid = props.jobid; var jobid = props.jobid;
var layer = props.layer; var layer = props.layer;
if(Omatrix[layer] && Omatrix[layer].tl_name){ if(Omatrix[layer] && Omatrix[layer].tl_name){
layer = Omatrix[layer].tl_name if(!(/^drill/ig.test(Omatrix[layer].tl_name))){
layer = Omatrix[layer].tl_name
}
} }
var layerinfohash = props.layerinfohash; var layerinfohash = props.layerinfohash;
Object.keys(layerinfohash).forEach(function(key){ Object.keys(layerinfohash).forEach(function(key){
...@@ -751,11 +819,11 @@ function analysis(props){ ...@@ -751,11 +819,11 @@ function analysis(props){
return res.length return res.length
} }
T_m_p.prototype.analysis_vc_card_size = function(props){ // card短边尺寸 string T_m_p.prototype.analysis_vc_card_size = function(props){ // card短边尺寸 string
return GEN.getProfileLimits({job:this.job,step:this.pcs_step})[props].toFixed(3) return GEN.getProfileLimits({job:this.job,step:this.pcs_step,units:"mm"})[props].toFixed(2)
} }
T_m_p.prototype.analysis_vc_array_size = function(props){ // array长边尺寸 string T_m_p.prototype.analysis_vc_array_size = function(props){ // array长边尺寸 string
if(!this.array_step){return "error"} if(!this.array_step){return "_error"}
return GEN.getProfileLimits({job:this.job,step:this.array_step})[props].toFixed(3) 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){ //
return "_todo" return "_todo"
...@@ -771,7 +839,7 @@ function analysis(props){ ...@@ -771,7 +839,7 @@ function analysis(props){
laser_layers.push(val) laser_layers.push(val)
} }
} }
if(laser_layers.length == 0){return "error"} if(laser_layers.length == 0){return "_error"}
GEN.openStep({job:t.job,name:t.pcs_step}) GEN.openStep({job:t.job,name:t.pcs_step})
laser_layers = laser_layers.sort(function(a,b){return Number(a.row)-Number(b.row)}) laser_layers = laser_layers.sort(function(a,b){return Number(a.row)-Number(b.row)})
var laser_info = {} var laser_info = {}
...@@ -895,7 +963,7 @@ function analysis(props){ ...@@ -895,7 +963,7 @@ function analysis(props){
return "_todo" return "_todo"
} }
T_m_p.prototype.analysis_solder_mask_side = function(){ // 检查防焊层所在面次 T_m_p.prototype.analysis_solder_mask_side = function(){ // 检查防焊层所在面次
var solder_paste_layers = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "solder_paste"}) 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
...@@ -911,7 +979,7 @@ function analysis(props){ ...@@ -911,7 +979,7 @@ function analysis(props){
return res return res
} }
T_m_p.prototype.analysis_silk_screen_side = function(){ // 检查文字层所在面次 T_m_p.prototype.analysis_silk_screen_side = function(){ // 检查文字层所在面次
var solder_mask_layers = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "solder_mask"}) 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
...@@ -966,8 +1034,11 @@ function smdAnalysis(props){ ...@@ -966,8 +1034,11 @@ function smdAnalysis(props){
if (!res.hasOwnProperty(layer.solderL)){ if (!res.hasOwnProperty(layer.solderL)){
res[layer.solderL] = {} res[layer.solderL] = {}
} }
GEN.selectByFilter({profile:'in'}) if(GEN.getProfile({job:job, step:step}).match(/\n/ig).length > 1){
GEN.selAllFeat() GEN.selectByFilter({profile:'in'})
} else {
GEN.selAllFeat()
}
res[layer.solderL].sm_opening_count = GEN.getSelectCount() res[layer.solderL].sm_opening_count = GEN.getSelectCount()
GEN.selClearFeature() GEN.selClearFeature()
} }
...@@ -985,11 +1056,13 @@ function smdAnalysis(props){ ...@@ -985,11 +1056,13 @@ function smdAnalysis(props){
if (!res.hasOwnProperty(layer.signalL)){ if (!res.hasOwnProperty(layer.signalL)){
res[layer.signalL] = {} res[layer.signalL] = {}
} }
res[layer.signalL]["min_smd_width"] = symbolInfo["min_width"] if(symbolInfo["min_width"]){ res[layer.signalL]["min_smd_width"] = symbolInfo["min_width"] }
res[layer.signalL]["min_smd_length"] = symbolInfo["min_length"] if(symbolInfo["min_length"]){ res[layer.signalL]["min_smd_length"] = symbolInfo["min_length"] }
// 分析最小smd间距 // 分析最小smd间距
// 创建一个checklist并且分析 // 创建一个checklist并且分析
var min_smd_pitch = smdPitch({job:job,step:step,layer:tmp_layer}) 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_pitch"] = min_smd_pitch
// 分析开窗宽高 // 分析开窗宽高
if(layer.solderL){ if(layer.solderL){
...@@ -1003,8 +1076,8 @@ function smdAnalysis(props){ ...@@ -1003,8 +1076,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/})
res[layer.signalL].min_smd_opening_width = symbolInfo_solder["min_width"] if(symbolInfo_solder["min_width"]){res[layer.signalL].min_smd_opening_width = symbolInfo_solder["min_width"]}
res[layer.signalL].min_smd_opening_length = symbolInfo_solder["min_length"] if(symbolInfo_solder["min_length"]){res[layer.signalL].min_smd_opening_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})
...@@ -1030,9 +1103,16 @@ function symbolAnalysis(props){ ...@@ -1030,9 +1103,16 @@ function symbolAnalysis(props){
} }
return a return a
},{width:[],length:[]}) },{width:[],length:[]})
var min_width,min_length;
if(symbols.width.length){
min_width = symbols.width.reduce(function(a,b){return b-a > 0 ? a : b})
}
if(symbols.length.length){
min_length = symbols.length.reduce(function(a,b){return b-a > 0 ? a : b})
}
return { return {
min_width:symbols.width.reduce(function(a,b){return b-a > 0 ? a : b}), min_width:min_width<min_length? min_width :min_length,
min_length:symbols.length.reduce(function(a,b){return b-a > 0 ? a : b}) min_length:min_width<min_length? min_length :min_width
} }
} }
...@@ -1096,9 +1176,13 @@ function smdPitch(props){ ...@@ -1096,9 +1176,13 @@ function smdPitch(props){
var tmp_layer = tmp_layer2 + "_tmp" var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer}) selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'}); GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step}) var features = GEN.getFeatures({job:job,step:step,layer:tmp_layer})
// 获取最小smd间距 // 获取最小smd间距
var res = _.values(symbols).sort(function(a,b){return Number(a.size)-Number(b.size)})[0].size var tmp = features.map(function(v){
var num = Math.sqrt((v.xe-v.xs)*(v.xe-v.xs) + (v.ye-v.ys)*(v.ye-v.ys))*1000
return num.toFixed(4)
})
var res = tmp.sort(function(a,b){return a-b})[0]
GEN.deleteLayer({job:job,layer:tmp_layer}) GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1}) GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2}) GEN.deleteLayer({job:job,layer:tmp_layer2})
...@@ -1145,14 +1229,17 @@ function analysisChkAttr(par) { ...@@ -1145,14 +1229,17 @@ 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
}) })
if (a === "N/A" && /\d+/.test(tmp)) { if (a === "N/A" && /\d+/.test(tmp)) {
a = tmp tmp = Number(tmp)
a = tmp.toFixed(2)
} }
if (/\d+/.test(a) && /\d+/.test(tmp) && Number(tmp) < Number(a)) { if (/\d+/.test(a) && /\d+/.test(tmp) && Number(tmp) < Number(a)) {
a = tmp tmp = Number(tmp)
a = tmp.toFixed(2)
} }
return a return a
}, "N/A") }, "N/A")
...@@ -1162,32 +1249,36 @@ function analysisChkAttr(par) { ...@@ -1162,32 +1249,36 @@ function analysisChkAttr(par) {
} }
function analysisDrill(par, step){ 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"}
var job = Job.toLowerCase()
var res = par.map(function(drill){ var res = par.map(function(drill){
GEN.affectedLayer({affected:"yes",layer:drill.layer,clear_before:"yes",mode:"all"}) GEN.affectedLayer({affected:"yes",layer:drill.layer,clear_before:"yes",mode:"all"})
GEN.selClearFeature() GEN.selClearFeature()
GEN.selectByFilter({feat_types:"pad",include_syms:drill.symbol}) GEN.selectByFilter({feat_types:"pad",include_syms:drill.symbol})
// 拷贝到_tmp // 拷贝到_tmp
var tmplayer = drill.layer + "_tmp" var tmplayer = drill.layer + "_tmp"
if(GEN.isLayerExists({job:Job,layer:tmplayer})){GEN.deleteLayer({job:Job,step:step,layer:tmplayer})} if(GEN.isLayerExists({job:job,layer:tmplayer})){GEN.deleteLayer({job:job,step:step,layer:tmplayer})}
GEN.selCopyOther({dest:"layer_name",target_layer:tmplayer,invert:'no',dx:0,dy:0,size:0}) GEN.selCopyOther({dest:"layer_name",target_layer:tmplayer})
GEN.affectedLayer({affected:"no",mode:"all"}) GEN.affectedLayer({affected:"no",mode:"all"})
GEN.selClearFeature(); GEN.selClearFeature();
[drill.start,drill.end].forEach(function(item, i){ [drill.start,drill.end].forEach(function(item, i){
GEN.workLayer({name:item,display_number:1,clear_before:"yes"}) GEN.workLayer({name:item,display_number:1,clear_before:"yes"})
GEN.selRefFeat({ // GEN.selRefFeat({
layers: tmplayer, // layers: tmplayer,
use: "filter", // use: "filter",
mode: "include", // mode: "touch",
f_types: "pad", // f_types: "pad",
pads_as:"shape", // pads_as:"shape",
polarity:"positive", // polarity:"positive",
include_syms:drill.symbol, // include_syms:drill.symbol,
filter: { // filter: {
feat_types:'pad' // feat_types:'pad'
} // }
}) // })
GEN.COM("sel_ref_feat",
{layers:tmplayer,use:"filter",mode:"touch",pads_as:"shape",f_types:"pad",polarity:"positive\;negative",include_syms:drill.symbol})
var res = "" var res = ""
var pads = GEN.getFeatures({job:Job,step:step,layer:item,options:"select"}) var pads = GEN.getFeatures({job:job,step:step,layer:item,options:"select"})
if(pads && pads.length) { if(pads && pads.length) {
pads = pads.filter(function(item){ pads = pads.filter(function(item){
return /^r\d+/.test(item.symbol) return /^r\d+/.test(item.symbol)
...@@ -1203,7 +1294,7 @@ function analysisDrill(par, step){ ...@@ -1203,7 +1294,7 @@ function analysisDrill(par, step){
drill.drl_pad_bot = res drill.drl_pad_bot = res
} }
}) })
GEN.deleteLayer({job:Job,step:step,layer:tmplayer}) GEN.deleteLayer({job:job,step:step,layer:tmplayer})
return drill return drill
}) })
return res return res
...@@ -1249,22 +1340,23 @@ function bgaAnalysis(props){ ...@@ -1249,22 +1340,23 @@ function bgaAnalysis(props){
if (!res.hasOwnProperty(layer.signalL)){ if (!res.hasOwnProperty(layer.signalL)){
res[layer.signalL] = {} res[layer.signalL] = {}
} }
res[layer.signalL].min_bga_size = min_symbols_info["min_bga_size"] res[layer.signalL].min_bga_size = myFixed(min_symbols_info["min_bga_size"],4)
res[layer.signalL].min_bga_openging_size = min_symbols_info["min_bga_openging_size"] res[layer.signalL].min_bga_openging_size = myFixed(min_symbols_info["min_bga_openging_size"],4)
res[layer.signalL].min_bga_pitch = min_symbols_info["min_bga_pitch"] res[layer.signalL].min_bga_pitch = myFixed(min_symbols_info["min_bga_pitch"],4)
// 分析所有BGA // 分析所有BGA
var all_bga_min_pitch_info = all_bga_min_pitch_anal({job:job, step:step, layer:tmp_layer,solderLayer:layer.solderL}) var all_bga_min_pitch_info = all_bga_min_pitch_anal({job:job, step:step, layer:tmp_layer,solderLayer:layer.solderL})
res[layer.signalL].bga_min_pitch = all_bga_min_pitch_info["bga_min_pitch"] res[layer.signalL].bga_min_pitch = myFixed(all_bga_min_pitch_info["bga_min_pitch"],4)
res[layer.signalL].bga_min_pitch_pad_size = all_bga_min_pitch_info["bga_min_pitch_pad_size"] res[layer.signalL].bga_min_pitch_pad_size = myFixed(all_bga_min_pitch_info["bga_min_pitch_pad_size"],4)
res[layer.signalL].bga_min_pitch_openging_size = all_bga_min_pitch_info["bga_min_pitch_openging_size"] res[layer.signalL].bga_min_pitch_openging_size = myFixed(all_bga_min_pitch_info["bga_min_pitch_openging_size"],4)
GEN.deleteLayer({job:job,layer:tmp_layer}) GEN.deleteLayer({job:job,layer:tmp_layer})
} }
}) })
GEN.closeStep() GEN.closeStep()
}) })
console.log(res);
return res return res
} }
function min_symbols_anal(props){ // 分析最symbols function min_symbols_anal(props){ // 分析最 symbols
var job = props.job var job = props.job
var step = props.step var step = props.step
var layer = props.layer var layer = props.layer
...@@ -1290,7 +1382,12 @@ function min_symbols_anal(props){ // 分析最小symbols ...@@ -1290,7 +1382,12 @@ function min_symbols_anal(props){ // 分析最小symbols
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step}) var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step})
res.min_bga_openging_size = _.values(symbols_solder).reduce(function(a,b){ res.min_bga_openging_size = _.values(symbols_solder).reduce(function(a,b){
if (b.pad > 0 && b.line) { if (b.pad > 0 && b.line) {
a.push({symbol:b.symbol, size:Number(b.size)}) if(/^rect|^oval/.test(b.symbol)){
b.size = b.width < b.height ? b.width : b.height
}
if(b.size) {
a.push({symbol:b.symbol, size:Number(b.size)})
}
} }
return a return a
},[]).sort(function(a,b){return a.size-b.size})[0].size },[]).sort(function(a,b){return a.size-b.size})[0].size
...@@ -1466,538 +1563,110 @@ function bgaPitch(props){ ...@@ -1466,538 +1563,110 @@ function bgaPitch(props){
var tmp_layer = tmp_layer2 + "_tmp" var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer}) selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'}); GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step}) var features = GEN.getFeatures({job:job,step:step,layer:tmp_layer})
// 获取最小smd间距 var tmp = features.map(function(v){
var res = _.values(symbols).sort(function(a,b){return Number(a.size)-Number(b.size)})[0].size var num = Math.sqrt((v.xe-v.xs)*(v.xe-v.xs) + (v.ye-v.ys)*(v.ye-v.ys))*1000
return num.toFixed(4)
})
var res = tmp.sort(function(a,b){return a-b})[0]
GEN.deleteLayer({job:job,layer:tmp_layer}) GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1}) GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2}) GEN.deleteLayer({job:job,layer:tmp_layer2})
// 矩阵 // 矩阵
return res return res
} }
function tmp(){ function hasAttr(props){ // 判断层 有没有部分属性
return { var job = props.job // 有没有smd和bga属性的物件
"sst": { var attr = props.attr
"row": "1","type": "solder_paste","name": "sp_fr","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "", var step = props.step
"tl_num": -1000,"tl_name": "sp_fr","tl_type": "solder_paste","odb_name": "sst","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top", var res = false
"row_num": -1000,"odb_row_num": "1" try {
}, var layers = props.layers
"spt": { GEN.openStep({job:job,name:step})
"row": "2","type": "solder_paste","name": "sp_fr(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "", for (var i = 0;i <layers.length;i++){
"tl_num": -999,"tl_name": "sp_fr(2)","tl_type": "solder_paste","odb_name": "spt","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top", var layer = layers[i]
"row_num": -999,"odb_row_num": "2" GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
}, GEN.selClearFeature()
"smt": { GEN.selectByFilter({attribute:attr})
"row": "3","type": "solder_mask","name": "sm_fr","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "", var count = GEN.getSelectCount()
"tl_num": -998,"tl_name": "sm_fr","tl_type": "solder_mask","odb_name": "smt","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "top", if(count && count > 0){
"row_num": -998,"odb_row_num": "3" throw true
}, }
"top": { }
"row": "4","type": "outer","name": "top","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "", GEN.clearLayers()
"tl_num": 1,"tl_name": "top","tl_type": "outer","odb_name": "top","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "top", GEN.closeStep()
"row_num": 1,"odb_row_num": "4" }
}, catch (msg) {
"isl2": { res = msg
"row": "5","type": "inner","name": "l2","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "", GEN.clearLayers()
"tl_num": 2,"tl_name": "l2","tl_type": "inner","odb_name": "isl2","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner", GEN.closeStep()
"row_num": 2,"odb_row_num": "5"
},
"isl3": {
"row": "6","type": "inner","name": "l3","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 3,"tl_name": "l3","tl_type": "inner","odb_name": "isl3","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 3,"odb_row_num": "6"
},
"isl4": {
"row": "7","type": "inner","name": "l4","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 4,"tl_name": "l4","tl_type": "inner","odb_name": "isl4","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 4,"odb_row_num": "7"
},
"isl5": {
"row": "8","type": "inner","name": "l5","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 5,"tl_name": "l5","tl_type": "inner","odb_name": "isl5","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 5,"odb_row_num": "8"
},
"isl6": {
"row": "9","type": "inner","name": "l6","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 6,"tl_name": "l6","tl_type": "inner","odb_name": "isl6","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 6,"odb_row_num": "9"
},
"isl7": {
"row": "10","type": "inner","name": "l7","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 7,"tl_name": "l7","tl_type": "inner","odb_name": "isl7","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 7,"odb_row_num": "10"
},
"isl8": {
"row": "11","type": "inner","name": "l8","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 8,"tl_name": "l8","tl_type": "inner","odb_name": "isl8","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 8,"odb_row_num": "11"
},
"isl9": {
"row": "12","type": "inner","name": "l9","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 9,"tl_name": "l9","tl_type": "inner","odb_name": "isl9","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 9,"odb_row_num": "12"
},
"bottom": {
"row": "13","type": "outer","name": "bottom","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 10,"tl_name": "bottom","tl_type": "outer","odb_name": "bottom","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "bottom",
"row_num": 10,"odb_row_num": "13"
},
"smb": {
"row": "14","type": "solder_mask","name": "sm_ba","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1013,"tl_name": "sm_ba","tl_type": "solder_mask","odb_name": "smb","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1013,"odb_row_num": "14"
},
"spb": {
"row": "15","type": "solder_paste","name": "sp_ba","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1014,"tl_name": "sp_ba","tl_type": "solder_paste","odb_name": "spb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1014,"odb_row_num": "15"
},
"ssb": {
"row": "16","type": "solder_paste","name": "sp_ba(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1015,"tl_name": "sp_ba(2)","tl_type": "solder_paste","odb_name": "ssb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1015,"odb_row_num": "16"
},
"d1-2": {
"row": "17","type": "laser_drill","name": "d1-2","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top",
"drl_end": "isl2","gdrl_start": "top","gdrl_end": "isl2","drl_start_num": "1","drl_end_num": "2","tl_name": "drill1-2","tl_type": "drill",
"tl_num": 10016,"odb_name": "d1-2","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10016,"odb_row_num": "17","drl_from_num": "1","drl_to_num": "2"
},
"d2-3": {
"row": "18","type": "laser_drill","name": "d2-3","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl2","drl_end": "isl3","gdrl_start": "isl2","gdrl_end": "isl3","drl_start_num": "2","drl_end_num": "3","tl_name": "drill2-3","tl_type": "drill",
"tl_num": 10017,"odb_name": "d2-3","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10017,"odb_row_num": "18","drl_from_num": "2","drl_to_num": "3"
},
"d3-4": {
"row": "19","type": "laser_drill","name": "d3-4","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl3","drl_end": "isl4","gdrl_start": "isl3","gdrl_end": "isl4","drl_start_num": "3","drl_end_num": "4","tl_name": "drill3-4","tl_type": "drill",
"tl_num": 10018,"odb_name": "d3-4","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10018,"odb_row_num": "19","drl_from_num": "3","drl_to_num": "4"
},
"d4-5": {
"row": "20","type": "laser_drill","name": "d4-5","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl4","drl_end": "isl5","gdrl_start": "isl4","gdrl_end": "isl5","drl_start_num": "4","drl_end_num": "5","tl_name": "drill4-5","tl_type": "drill",
"tl_num": 10019,"odb_name": "d4-5","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10019,"odb_row_num": "20","drl_from_num": "4","drl_to_num": "5"
},
"d5-6": {
"row": "21","type": "laser_drill","name": "d5-6","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl5","drl_end": "isl6","gdrl_start": "isl5","gdrl_end": "isl6","drl_start_num": "5","drl_end_num": "6","tl_name": "drill5-6","tl_type": "drill",
"tl_num": 10020,"odb_name": "d5-6","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10020,"odb_row_num": "21","drl_from_num": "5","drl_to_num": "6"
},
"d6-7": {
"row": "22","type": "laser_drill","name": "d6-7","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl6","drl_end": "isl7","gdrl_start": "isl6","gdrl_end": "isl7","drl_start_num": "6","drl_end_num": "7","tl_name": "drill6-7","tl_type": "drill",
"tl_num": 10021,"odb_name": "d6-7","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10021,"odb_row_num": "22","drl_from_num": "6","drl_to_num": "7"
},
"d7-8": {
"row": "23","type": "laser_drill","name": "d7-8","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl7","drl_end": "isl8","gdrl_start": "isl7","gdrl_end": "isl8","drl_start_num": "7","drl_end_num": "8","tl_name": "drill7-8","tl_type": "drill",
"tl_num": 10022,"odb_name": "d7-8","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10022,"odb_row_num": "23","drl_from_num": "7","drl_to_num": "8"
},
"d8-9": {
"row": "24","type": "laser_drill","name": "d8-9","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl8","drl_end": "isl9","gdrl_start": "isl8","gdrl_end": "isl9","drl_start_num": "8","drl_end_num": "9","tl_name": "drill8-9","tl_type": "drill",
"tl_num": 10023,"odb_name": "d8-9","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10023,"odb_row_num": "24","drl_from_num": "8","drl_to_num": "9"
},
"d9-10": {
"row": "25","type": "laser_drill","name": "d9-10","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl9","drl_end": "bottom","gdrl_start": "isl9","gdrl_end": "bottom","drl_start_num": "9","drl_end_num": "10","tl_name": "drill9-10","tl_type": "drill",
"tl_num": 10024,"odb_name": "d9-10","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10024,"odb_row_num": "25","drl_from_num": "9","drl_to_num": "10"
},
"drill": {
"row": "26","type": "main_drill","name": "drill","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","drl_start_num": 1,"drl_end_num": 10,"tl_name": "drill","tl_type": "drill",
"tl_num": 10025,"odb_name": "drill","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10025,"odb_row_num": "26","drl_from_num": 1,"drl_to_num": 10
},
"rout": {
"row": "27","type": "other","name": "__rout__","context": "board","layer_type": "rout","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","odb_name": "rout","odb_context": "board","odb_type": "rout","odb_polarity": "positive","odb_side": "none","odb_row_num": "27"
},
"nclegend-1-2": {
"row": "28","type": "other","name": "__nclegend-1-2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110027,"odb_name": "nclegend-1-2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110027,"odb_row_num": "28"
},
"nclegend-2-3": {
"row": "29","type": "other","name": "__nclegend-2-3__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110028,"odb_name": "nclegend-2-3","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110028,"odb_row_num": "29"
},
"nclegend-3-4": {
"row": "30","type": "other","name": "__nclegend-3-4__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110029,"odb_name": "nclegend-3-4","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110029,"odb_row_num": "30"
},
"nclegend-4-5": {
"row": "31","type": "other","name": "__nclegend-4-5__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110030,"odb_name": "nclegend-4-5","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110030,"odb_row_num": "31"
},
"nclegend-5-6": {
"row": "32","type": "other","name": "__nclegend-5-6__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110031,"odb_name": "nclegend-5-6","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110031,"odb_row_num": "32"
},
"nclegend-6-7": {
"row": "33","type": "other","name": "__nclegend-6-7__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110032,"odb_name": "nclegend-6-7","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110032,"odb_row_num": "33"
},
"nclegend-7-8": {
"row": "34","type": "other","name": "__nclegend-7-8__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110033,"odb_name": "nclegend-7-8","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110033,"odb_row_num": "34"
},
"nclegend-8-9": {
"row": "35","type": "other","name": "__nclegend-8-9__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110034,"odb_name": "nclegend-8-9","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110034,"odb_row_num": "35"
},
"nclegend-9-10": {
"row": "36","type": "other","name": "__nclegend-9-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110035,"odb_name": "nclegend-9-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110035,"odb_row_num": "36"
},
"nclegend-1-10": {
"row": "37","type": "other","name": "__nclegend-1-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110036,"odb_name": "nclegend-1-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110036,"odb_row_num": "37"
},
"outline": {
"row": "38","type": "other","name": "__outline__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110037,"odb_name": "outline","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110037,"odb_row_num": "38"
},
"top_assem": {
"row": "39","type": "other","name": "__top_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110038,"odb_name": "top_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110038,"odb_row_num": "39"
},
"bot_assem": {
"row": "40","type": "other","name": "__bot_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110039,"odb_name": "bot_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110039,"odb_row_num": "40"
},
"top_testpoint": {
"row": "41","type": "other","name": "__top_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110040,"odb_name": "top_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110040,"odb_row_num": "41"
},
"bot_testpoint": {
"row": "42","type": "other","name": "__bot_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110041,"odb_name": "bot_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110041,"odb_row_num": "42"
},
"top_osp": {
"row": "43","type": "other","name": "__top_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110042,"odb_name": "top_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110042,"odb_row_num": "43"
},
"bot_osp": {
"row": "44","type": "other","name": "__bot_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110043,"odb_name": "bot_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110043,"odb_row_num": "44"
},
"top_enig": {
"row": "45","type": "other","name": "__top_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110044,"odb_name": "top_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110044,"odb_row_num": "45"
},
"bot_enig": {
"row": "46","type": "other","name": "__bot_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110045,"odb_name": "bot_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110045,"odb_row_num": "46"
},
"fab_page2": {
"row": "47","type": "other","name": "__fab_page2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110046,"odb_name": "fab_page2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110046,"odb_row_num": "47"
},
"tmp_top_shorts": {
"row": "48","type": "other","name": "__tmp_top_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110047,"odb_name": "tmp_top_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110047,"odb_row_num": "48"
},
"tmp_bot_shorts": {
"row": "49","type": "other","name": "__tmp_bot_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110048,"odb_name": "tmp_bot_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110048,"odb_row_num": "49"
},
"bot_assy_mate": {
"row": "50","type": "other","name": "__bot_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110049,"odb_name": "bot_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110049,"odb_row_num": "50"
},
"outline+1": {
"row": "51","type": "other","name": "__outline+1__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110050,"odb_name": "outline+1","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110050,"odb_row_num": "51"
},
"top_assy_mate": {
"row": "52","type": "other","name": "__top_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110051,"odb_name": "top_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110051,"odb_row_num": "52"
}
} }
return res
}
function myFixed(str, num) {
if(/^[1-9][0-9]*([.][0-9]+)?$/.test(str)){
var tmp = String(str)
if(tmp.search(/\./) >= 0){
tmp = tmp.split(".")
if(tmp[1].length > num){
tmp[1] = tmp[1].substr(0, num)
return tmp.join(".")
}
return str
}
return str
} else {
return str
}
} }
function tmp_2(){ function createOutline(props){
return { var job = props.job
"cad": { var step = props.step
"d1-2": { var matrix = props.matrix
"1": { var outlines = Object.keys(matrix).filter(function(v){return /^outline$|^rout$/ig.test(v)})
"count": "06896", var drill_layer = Object.keys(matrix).filter(function(v){return matrix[v].layer_type=="drill" && matrix[v].context == "board"})
"num": "1", var tmp_outline
"type": "via", if(outlines.length){
"min_tol": "2.756", if( outlines.length > 1 && outlines.indexOf("outline")>=0){
"max_tol": "0.984", tmp_outline = "outline"
"finish_size": "2.756", if(cl(tmp_outline)) {
"drill_size": "2.756", return true
"slot_len": "0", }else{
"type2": "laser", return cl("rout")
"shape": "hole",
"bit": 0
}
},
"d2-3": {
"1": {
"count": "07430",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d3-4": {
"1": {
"count": "06866",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d4-5": {
"1": {
"count": "06413",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d5-6": {
"1": {
"count": "08938",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d6-7": {
"1": {
"count": "09057",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d7-8": {
"1": {
"count": "07818",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d8-9": {
"1": {
"count": "09126",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d9-10": {
"1": {
"count": "08498",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"drill": {
"1": {
"count": "05",
"num": "1",
"type": "non_plated",
"min_tol": "3.15",
"max_tol": "3.15",
"finish_size": "15.748",
"drill_size": "15.748",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"2": {
"count": "01",
"num": "2",
"type": "non_plated",
"min_tol": "0",
"max_tol": "1.969",
"finish_size": "35.039",
"drill_size": "35.039",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"3": {
"count": "01",
"num": "3",
"type": "non_plated",
"min_tol": "3.15",
"max_tol": "3.15",
"finish_size": "35.039",
"drill_size": "35.039",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"4": {
"count": "01",
"num": "4",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "47.244",
"drill_size": "47.244",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"5": {
"count": "05",
"num": "5",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "59.055",
"drill_size": "59.055",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"6": {
"count": "01",
"num": "6",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "70.866",
"drill_size": "70.866",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"7": {
"count": "01",
"num": "7",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "74.803",
"drill_size": "74.803",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
}
}
},
"stp": {
"d1-2": {},
"d2-3": {},
"d3-4": {},
"d4-5": {},
"d5-6": {},
"d6-7": {},
"d7-8": {},
"d8-9": {},
"d9-10": {},
"drill": {
"1": {
"count": "08",
"num": "1",
"type": "non_plated",
"min_tol": "0",
"max_tol": "1.969",
"finish_size": "118.11",
"drill_size": "118.11",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
}
} }
} else {
return cl(outlines[0])
} }
}else{return false}
function cl(l){
GEN.openStep({job:job, name:step})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:l,display_number:2,clear_before:"yes"})
GEN.selClearFeature()
GEN.COM("sel_cut_data,det_tol=1,con_tol=1,rad_tol=0.1,filter_overlaps=no,delete_doubles=no,use_order=yes,ignore_width=yes,ignore_holes=none,start_positive=yes,polarity_of_touching=same")
var tmp_layer = l+"+++"
GEN.selRefFeat({layers:drill_layer[0],use:'filter',mode:'touch'})
if(GEN.getSelectCount() > 0){
var tmp_outline = l + "_tmp"
selCopyLayer({job:job,layer:tmp_outline})
GEN.workLayer({name:l,display_number:2,clear_before:"yes"})
GEN.selAllFeat()
GEN.selDelete()
GEN.workLayer({name:tmp_outline,display_number:2,clear_before:"yes"})
GEN.COM("sel_surf2outline,width=15")
GEN.selAllFeat()
selCopyLayer({job:job,layer:l})
GEN.workLayer({name:l,display_number:2,clear_before:"yes"})
GEN.selClearFeature()
GEN.selCreateProfile()
GEN.deleteLayer({job:job, layer:tmp_layer})
GEN.deleteLayer({job:job, layer:tmp_outline})
return true
}
GEN.deleteLayer({job:job, layer:tmp_layer})
return false
} }
} }
\ No newline at end of file
/*
NAME:
DESCRIPTION: 客户数据分析
PARAMETER:
[
{
name : 'pcs_step',
title : 'pcsStep名',
type : 'LineEdit',
property : {tool_tip : 'pcs step名,默认是cad'}
},
{
name : 'array_step',
title : 'arrayStep名',
type : 'LineEdit',
property : {tool_tip : 'array step名,默认是stp'}
},
{
name : 'erf',
title : 'erf名称',
type : 'LineEdit',
property : {tool_tip : 'erf名称'}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 客户数据分析</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 客户参数 </p>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
*/
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var JobId = $.job_id;
var database = require("topsin.database");
var Omatrix = {};
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title
},
where: { id: $.task_id }
});
}
var GEN = $.gen;
var Job = $.job_name;
var db = $.db;
var Status = 'ok';
var resultData = [];
var PAR = {};
if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
try {
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" }
// 检查料号是否能够check out
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
var pcs_step = par.pcs_step == "" ? "cad" : par.pcs_step;
var array_step = par.array_step == "" ? "stp" : par.array_step;
var step_list = GEN.getStepList({job:job})
if(step_list.indexOf(array_step)<0){
array_step = false
}
if(step_list.indexOf(pcs_step)<0){
pcs_step = step_list[0]
}
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
GEN.openStep({job:job, name:pcs_step})
_.values(matrix).forEach(function(v){
if(v.context == "board" && v.layer_type == "drill"){
if(v.type == "laser_drill"){
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selAllFeat()
if(GEN.getSelectCount()>0){
GEN.COM("cur_atr_set,attribute=.drill,option=via")
GEN.COM("sel_change_atr,mode=add")
}
GEN.clearLayers()
GEN.selClearFeature()
} else if(v.type == "main_drill" || v.type == "blind_drill" || v.type == "bury_drill") {
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:v.drl_start,use:'filter',mode:'touch',f_types:"pad"})
GEN.selRefFeat({layers:v.drl_end,use:'filter',mode:'touch',f_types:"pad"})
if(GEN.getSelectCount()>0){
GEN.COM("cur_atr_set,attribute=.drill,option=plated")
GEN.COM("sel_change_atr,mode=add")
}
GEN.selReverse()
if(GEN.getSelectCount() > 0){
GEN.COM("cur_atr_set,attribute=.drill,option=non_plated")
GEN.COM("sel_change_atr,mode=add")
}
}
}
})
GEN.closeStep()
console.log("===================>steplist:"+_.toString(step_list))
if(step_list.indexOf(pcs_step)<0){throw "can not find pcsstep"}
if(step_list.indexOf(array_step)<0){array_step = false}
console.log("===================================> 1matrix")
var analysis_obj = analysis({job:job,jobId:JobId,pcs_step:pcs_step,array_step:array_step,matrix:matrix})
// 创建profile
var tmp_matrix = GEN.getMatrix({job:job})
var board_layer = Object.keys(tmp_matrix).filter(function(v){
return tmp_matrix[v].context == "board"
})
GEN.openStep({job:job, name:pcs_step})
var now_profile = GEN.getProfile({job:job, step:pcs_step})
console.log("profile:===============>"+now_profile);
console.log(now_profile.match(/\n/ig).length);
if(now_profile.match(/\n/ig).length == 1){ // 如果没有profile
var alllayers = Object.keys(matrix)
if (alllayers.indexOf("outline") >= 0){ // 如果有outline层
GEN.affectedLayer({ affected: 'no', mode: 'all' })
GEN.clearLayers()
GEN.workLayer({name:'outline',display_number:2,clear_before:'yes'})
GEN.selectByFilter({feat_types:'line\;arc'})
var count = GEN.getSelectCount()
if(count > 0) {
GEN.selCreateProfile()
}
GEN.clearLayers()
console.log("create profile ok");
}
}
GEN.affectedLayer({affected:'yes',layer: board_layer, clear_before:"yes"})
GEN.selectByFilter({profile:"out"})
if(GEN.getSelectCount() > 0){
GEN.selDelete()
}
GEN.closeStep()
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 // ? 保留小数
vc_pcs_count_on_panel: true, // todo 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
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层
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:检查文字层所在面次
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圆孔
min_slot_drl_size: true, // todo 0.8mm 最小槽孔
max_slot_drl_size: true, // todo 1.2mm 最大槽孔
max_slot_drl_length: true, // todo 2.0mm 最大槽孔
max_spec_slot_drl_size: true, // todo 2.1mm 最大异形槽孔
max_spec_slot_drl_length: true, // todo 3.0mm 最大异形槽孔
}
}
console.log("================== ================> 2analysis_obj")
// 分析料号info
var jobInfo = {}
Object.keys(config.jobInfo).forEach(function(key){
var props = config.jobInfo[key];
console.log("===================================> 2analysis_obj:key:"+key)
if(props){
try {
if(props.hasOwnProperty("api") && props.hasOwnProperty("props")){
jobInfo[key] = analysis_obj["analysis_"+props.api](props.props)
} else if(props.only_value){
jobInfo[key] = analysis_obj.jobInfo[key]
} else {
jobInfo[key] = analysis_obj["analysis_"+key](props)
}
} catch (e) {
console.log(e);
jobInfo[key] = "_error"
}
}
})
console.log("===================================> 3 jobinfo")
// 过滤掉料号信息的 _todo 和 _error
for (var key in jobInfo) {
if(jobInfo[key]==="yes"){jobInfo[key] = "Yes"}
if(jobInfo[key]==="no"){jobInfo[key] = "No"}
if(jobInfo[key] === "_todo" || jobInfo[key] === "_error"){
delete jobInfo[key]
}
}
console.log("===================================> 4 save job info")
save_job_info({
jobid: JobId,
jobinfohash: jobInfo
})
console.log("===================================> 5 save drill info")
// 获取pcs_step 和 array_step的钻孔信息
var drill_info = {};
var drillLayers = analysis_obj.matrixInfo.mDrills;
[pcs_step, array_step].forEach(function(step){
if(step){
var tmp_step = step + "_tmp"
GEN.matrixCopyStep({job:job,step:tmp_step,step:tmp_step})
GEN.COM("copy_entity",{type:"step",source_job:job,source_name:step,dest_job:job,dest_name:tmp_step})
GEN.openStep({job:job, name: tmp_step})
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})
drill_info[step][layer.name] = layer_tool_manager
})
GEN.closeStep()
GEN.deleteStep({job:job,step:tmp_step})
}
})
var pcs_tool_manager = drill_info[pcs_step];
var array_tool_manager = drill_info[array_step];
Object.keys(pcs_tool_manager).forEach(function(layer){
Object.keys(pcs_tool_manager[layer]).forEach(function(key){
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 data = {
job_id: JobId,
layer_name: layer,
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,
finish_slot_length: tool.slot_len,
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"}
}
if(!array_count){delete data.array_count}
var id = db.query("",function(q){
return q.selectValue({
table:'pdm_job_cam_drill',
field:"id",
where:{job_id:JobId, layer_name: layer,tool_num: key}
})
});
console.log("=========>drillid:"+id)
if(/done/ig.test(id) || !id){
db.query("",function(q){
return q.insertRow({
table:'pdm_job_cam_drill',
data:data,
return_field:'id',
})
});
}else{
db.query("",function(q){
return q.updateRow({
table:'pdm_job_cam_drill',
where: {id:id},
data:data,
update_policy:{tags:'array_append', attr_data:'json_merge'}
})
});
}
})
})
console.log("=========== ===================> 6 set smd bga")
var hasattrs = [".smd",".bga"]
var ishasattrs = hasattrs.reduce(function(a,b){ // 判断是否含有.smd属性
if(!hasAttr({job:job,step:pcs_step,attr:b,layers:analysis_obj.matrixInfo.mOuters})){ a = false }
return a
},true)
if(!ishasattrs){ // 如果找不到.smd 分析.smd
GEN.COM("chklist_single,action=valor_cleanup_set_smd,show=yes")
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_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("chklist_close,chklist=valor_cleanup_set_smd,mode=hide")
}
// GEN.createChklist()
console.log("============= ===============> 6 analysis smd")
// smd
var smdInfo;
try {
if(!analysis_obj.matrixInfo.mOuters[0].solderL){throw "no mask"}
smdInfo = smdAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".smd"})
} catch (msg) {
console.log("smdInfo:error:"+msg)
}
// bga
console.log("===================================> 7 bga info")
var bgaInfo;
// try {
bgaInfo = bgaAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".bga"})
// } catch (msg) {
// console.log("bgaInfo:error:"+msg)
// }
console.log("========================bgaInfo:" + _.toString(bgaInfo));
// 保存
console.log("============== =====================> 8 save bga smd info")
var save_info = [smdInfo, analysis_obj.jobInfo.laser_info,bgaInfo]; // 保存 smd 和 bga数据
save_info.forEach(function(item){
if(JSON.stringify(item)!= "{}" && item){
Object.keys(item).forEach(function(key){
var val = item[key]
save_layerinfo({
jobid: JobId,
layer: key,
layerinfohash: val
})
})
}
})
console.log("================================> 9 copper_percent signal drill")
// 分析layer info
var stepList = [pcs_step];
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})
var info = {
min_line_width: ["line","user_nor_line"],
min_line_spacing: ["l2l"],
min_line2pad: ["p2line"],
min_pad2pad: ["p2p", "smd2smd", "smd2pad"],
min_ar: ["ar","pth_ar"]
}
stepList.forEach(function(step){
GEN.openStep({ job: job, name: step })
// 曝光
analysis_obj.matrixInfo.mOuters.forEach(function(item){
if(item.solderL){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL})
// {"area":"0.73817","percent":"8.986"}
var tmp_area = tmp_info.area
var tmp_percent = tmp_info.percent + "%"
save_layerinfo({
jobid: JobId,
layer: item.signalL,
layerinfohash: {
ref_layer: item.solderL,
exposed_area: tmp_area
}
})
}
})
GEN.clearLayers()
GEN.affectedLayer({ affected: 'no', mode: 'all' })
// 创建chklist并运行 如果chklist存在先删除
if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) {
GEN.COM("chklist_delete", { chklist: oChecklistName })
}
var tmpitem = {
name: "signal_layer_checks",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes"
}
}
if(par.erf){
tmpitem.erf = par.erf
}
createChklistAndRun({ // 创建checklist并运行
layers: signalLayers,
items: [tmpitem]
})
console.log("================== =================> 11 signals analysis")
// signal层分析结果
var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName})
// 钻孔
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:matrix[v]["drl_start"],end:matrix[v]["drl_end"]}
})
console.log("===================================> 12 Drill analysis")
var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果
// 数据入库
Object.keys(res).forEach(function(key){
var val = res[key]
save_layerinfo({
jobid: JobId,
layer: key,
layerinfohash: val
})
})
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,
}
})
})
// 铜面积
console.log("===================================> 13 save copper_percent")
// 创建profile
var new_martix = GEN.getMatrix({job:job})
var profileLayer = Object.keys(new_martix).filter(function(v){
return new_martix[v].layer_type=="rout" && new_martix[v].context == "board"
})
if(profileLayer.length){
if(GEN.getProfile({job:job, step:pcs_step}).match(/\n/ig).length == 1){ // 如果没有profile
var tmp = profileLayer[0]
if(profileLayer.indexOf("outline")>=0){tmp = "outline"}
GEN.openStep({job:job,name:pcs_step})
GEN.workLayer({name:tmp,display_number:2,clear_before:'yes'})
GEN.selectByFilter({feat_types:'line\;arc'})
var count = GEN.getSelectCount()
if(count > 0){
GEN.selCreateProfile()
GEN.selClearFeature()
} else if(profileLayer.length > 1) {
GEN.workLayer({name:"rout",display_number:2,clear_before:'yes'})
GEN.selectByFilter({feat_types:'line\;arc'})
if(GEN.getSelectCount() > 0){
GEN.selCreateProfile()
GEN.selClearFeature()
}
}
}
var copper_percent_pcs = signalLayers.map(function(v){
var tmp = {layer:v}
tmp.copper_percent = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
GEN.closeStep()
copper_percent_pcs.forEach(function(item){
save_layerinfo({
jobid: JobId,
layer: item.layer,
layerinfohash: {
copper_percent: item.copper_percent
}
})
})
}
})
// 保存
if(/yes/ig.test(par.auto_save)){
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
} else {
GEN.checkInout({job:job,mode:"in"})
}
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
progress: 33.33
},
where: { id: $.task_id }
});
if (GEN.hasError()) {
Status = 'error';
resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {
status: Status,
result_data: resultData
};
} else {
resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
return {
status: Status,
result_data: resultData
};
}
}
catch (e) {
Status = 'error';
console.log("==================== ============>error");
console.log(_.toString(e));
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return {status: Status, result_data: resultData};
}
function UPLOAD_LAYER_MATRIX(props){
var job = props.job
props.jobcategory = props.jobcategory || "work"
var matrix = ANALYSIS_STACKUP({job:job, jobcategory:props.jobcategory});
var layers = Object.keys(matrix).sort(function(a,b){return matrix[a]["row"] - matrix[b]["row"]})
var tableName = "pdm_job_" + props.jobcategory + "_layer";
console.log("===========>matrix upload");
var oLayers = db.query("",function(q){
return q.selectMapMap({
table:tableName,
field: ["odb_name", "release_status"],
where:{job_id:JobId},
uniquefield: "odb_name"
})
});
db.query("",function(q){
return q.deleteRow({
table:tableName,
where:{job_id:JobId},
})
});
var fieldLst = ["name", "odb_context", "odb_type", "odb_polarity", "odb_side", "drl_start", "drl_end",
"row_num", "type", "drl_start_num", "drl_end_num", "drl_from_num", "drl_to_num", "drl_connect_to",
"odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num"
];
layers.forEach(function(layer){
var layerInfo = matrix[layer];
var tmpData = {
"job_id": JobId,
"name": layerInfo["name"]
};
tmpData["release_status"] = (oLayers&&oLayers.hasOwnProperty(layerInfo["odb_name"])) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;
for (n = 0; n < fieldLst.length; n++) {
tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];
}
db.query("",function(q){
return q.insertRow({
table:tableName,
data: tmpData
})
});
})
console.log("===========>matrix upload end");
return matrix
}
function ANALYSIS_STACKUP(props){
var job = props.job
if(!props.hasOwnProperty("jobcategory")){ props.jobcategory = 'work' }
var matrix = GEN.getMatrix({job:job})
var layer_count = GEN.getLayerCount({job:job}) // !
save_job_info({jobid:JobId,jobcategory:props.jobcategory,jobinfohash:{TL_layer_count:layer_count}});
_.values(matrix).sort(function(a,b){return a.row-b.row}).forEach(function(layer){
layer.odb_name = layer.name;
layer.name = layer.tl_name;
layer.odb_context = layer.context;
layer.odb_type = layer.layer_type;
layer.odb_polarity = layer.polarity;
layer.odb_side = layer.side;
layer.row_num = layer.tl_num;
layer.type = layer.tl_type;
layer.side = layer.enum_tl_side;
layer.input_file_name = layer.file_name;
layer.odb_row_num = layer.row;
if (layer.odb_name == 'drill'){
layer.name = 'drill';
layer.drl_start_num = 1;
layer.drl_end_num = layer_count;
layer.drl_from_num = 1;
layer.drl_to_num = layer_count;
layer.type = 'main_drill';
}
else if (/^d(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'd' + drl_star + '-' + drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
if(drl_end - drl_star == 1){
layer.type = 'laser_drill'; // 镭射
} else if( drl_star == 1 || drl_end == layer_count ){
layer.type = 'blind_drill'; // 埋孔
} else{
layer.type = 'bury_drill'; // 盲孔
}
}
else if (/\-a$/.test(layer.odb_name)){
layer.side = 'top';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else if (/\-b$/.test(layer.odb_name)){
layer.side = 'bottom';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else{
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
})
return matrix;
}
function getMatrixInfo(props){ // 获取matrix各种信息
var job = props.job
var matrix = GEN.getMatrix({job:job})
Omatrix = matrix;
var res = {
matrix: matrix, // matrix
matrixVal: [], // matrix 的 value数组
mSignal: {}, // board的signal层 {}
mSignals: [], // board的signal层 []
mDrill: {}, // board的drill层
mDrills: [], // board的drill层
mSolderMask: {}, // 防焊层
mSolderMasks: [], // 防焊层
mOuters: [], // 外层和对于的防旱
mBoardLayer: [] // board层
}
for (var key in matrix) {
var value = matrix[key]
res.matrixVal.push(value)
if(value.context == "board"){
res.mBoardLayer.push(key)
switch (value.layer_type) {
case "signal":
res.mSignal[key] = value
res.mSignals.push(value)
break;
case "drill":
res.mDrill[key] = value
res.mDrills.push(value)
break;
case "solder_mask":
res.mSolderMask[key] = value
res.mSolderMasks.push(value)
break;
}
}
}
res.matrixVal = res.matrixVal.sort(function(a,b){return Number(a.row) - Number(b.row)})
res.mSignals = res.mSignals.sort(function(a,b){return Number(a.row) - Number(b.row)})
res.mDrills = res.mDrills.sort(function(a,b){return Number(a.row) - Number(b.row)})
// 找出外层 以及外层对应的防焊层 [{signalL:"top", solderL:"smt"}]
res.mOuters = res.mSignals.reduce(function(a,b){
if(b.tl_type == "outer"){
var solderLayers = res.mSolderMasks.filter(function(v){
return v.side == b.side
})
a.push({
signalL: b.name,
solderL: solderLayers.length >0 ? solderLayers[0]["name"] : null
})
}
return a
},[])
return res
}
function selCopyLayer(props){ // 拷贝选择的到辅助层
var layer = props.layer
var job = props.job
if(GEN.isLayerExists({job:job,layer:layer})){
GEN.deleteLayer({job:job,layer:layer})
}
GEN.selCopyOther({dest:'layer_name',target_layer:layer})
}
function save_job_info(props){ // 保存料号信息
var jobid = props.jobid;
var jobinfohash = props.jobinfohash;
Object.keys(jobinfohash).forEach(function(key){
var val = jobinfohash[key];
var value = db.query("",function(q){
return q.selectValue({
table:'pdm_job_jobattr',
field:"value",
where:{job_id:jobid, attr_name: key}
})
});
console.log("jobid:"+jobid+"==========dbjobvalue:" + val)
if(/done/ig.test(value) || !value){
db.query("",function(q){
return q.insertRow({
table:'pdm_job_jobattr', // todo
data:{job_id:jobid, attr_name:key, value:val}, // todo
return_field:'job_id',
})
});
} else if (value != val) {
console.log("jobid:"+jobid+"==========update jobvalue:"+value+"->" + val)
db.query("",function(q){
return q.updateRow({
table:'pdm_job_jobattr',
where:{job_id:jobid, attr_name: key},
data:{value:val},
})
});
}
})
}
function save_layerinfo(props){ // 保存层信息
var jobid = props.jobid;
var layer = props.layer;
if(Omatrix[layer] && Omatrix[layer].tl_name){
if(!(/^drill/ig.test(Omatrix[layer].tl_name))){
layer = Omatrix[layer].tl_name
}
}
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},
})
});
}
})
}
function analysis(props){
var job = props.job || Job;
var jobId = props.jobId || JobId;
var pcs_step = props.pcs_step || false;
var array_step = props.array_step || false;
var matrix = props.matrix;
function T_m_p(props){
this.job = props.job;
this.jobInfo = {};
this.jobId = props.jobId;
if(props.pcs_step){ this.pcs_step = props.pcs_step; }
if(props.matrix){ this.matrix = props.matrix; }
if(props.array_step){ this.array_step = props.array_step; }
this.matrixInfo = getMatrixInfo({job:this.job})
this.init();
}
T_m_p.prototype.init = function(){
var init_checking = ["job", "jobId", "pcs_step", "matrix"];
var t = this;
init_checking.forEach(function(v){ if(!t[v]){t.e(v+" is undefined")} })
}
T_m_p.prototype.e = function(e){ // 处理error
console.log(e)
throw e
}
T_m_p.prototype.analysis_layer_count = function(props){ // 分析board属性的层数量 []string
var matrix = this.matrixInfo.matrixVal;
var res = matrix.filter(function(v){return v.context == "board" && props.indexOf(v.layer_type) >= 0 })
return res.length
}
T_m_p.prototype.analysis_vc_card_size = function(props){ // card短边尺寸 string
return GEN.getProfileLimits({job:this.job,step:this.pcs_step})[props].toFixed(3)
}
T_m_p.prototype.analysis_vc_array_size = function(props){ // array长边尺寸 string
if(!this.array_step){return "_error"}
return GEN.getProfileLimits({job:this.job,step:this.array_step})[props].toFixed(3)
}
T_m_p.prototype.analysis_vc_pcs_count_on_panel = function(props){ //
return "_todo"
}
T_m_p.prototype.analysis_stack_vias_number = function(props){ // via孔连续叠加的层数
var t = this;
var res;
// 找出 镭射孔
var laser_layers = []
for (var key in t.matrix) {
var val = t.matrix[key]
if(val.type == "laser_drill"){
laser_layers.push(val)
}
}
if(laser_layers.length == 0){return "_error"}
GEN.openStep({job:t.job,name:t.pcs_step})
laser_layers = laser_layers.sort(function(a,b){return Number(a.row)-Number(b.row)})
var laser_info = {}
for(var i = 0; i < laser_layers.length-1; i++){
var start_layer = laser_layers[i].name
var cover_layer = laser_layers[i+1].name
GEN.workLayer({name:start_layer,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:cover_layer,use:'filter',mode:'cover'})
var count = GEN.getSelectCount()
if(count>0){
if(!laser_info[start_layer]){
laser_info[start_layer] = {}
}
laser_info[start_layer].drill_connect_layer = cover_layer
laser_info[start_layer].drill_connect_point = count
}
}
// via孔连续叠加的层数
var via_vias_info = []
function analysis_via_number(layers){
if(layers.length < 2){return}
var startlayer = layers[0].name + "_cover"
GEN.selClearFeature()
GEN.workLayer({name:layers[0].name,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
selCopyLayer({job:t.job,layer:startlayer})
var end_index = start_cover_next(startlayer,layers,0)
via_vias_info.push(end_index+1)
analysis_via_number(layers.slice(end_index))
}
function start_cover_next(start, layers, end_index){
if(layers.length < 2){
GEN.deleteLayer({job:t.job,layer:start})
return end_index
}
layers = layers.slice(1)
GEN.workLayer({name:start,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:layers[0].name,use:'filter',mode:'cover'})
var count = GEN.getSelectCount()
if (count < 1) {
GEN.deleteLayer({job:t.job,layer:start})
return ++end_index
}
var nextstartlayer = layers[0].name + "_cover"
selCopyLayer({job:t.job,layer:nextstartlayer})
GEN.deleteLayer({job:t.job,layer:start})
return start_cover_next(nextstartlayer,layers,++end_index)
}
analysis_via_number(laser_layers.slice())
if (via_vias_info.length == 1){
res = via_vias_info[0]
}else{
res = via_vias_info.reduce(function(a,b){return a-b>0?a :b})
}
t.jobInfo.stack_vias_more = "no"
if(GEN.getLayerCount({job:t.job}) > 14 && res >= 12){
t.jobInfo.stack_vias_more = "yes"
}
t.jobInfo.laser_info = laser_info;
return res
}
T_m_p.prototype.analysis_layer_exist = function(props){ // 存在某某层? string
return this.matrixInfo.matrix.hasOwnProperty(props) ? "yes" : "no"
}
T_m_p.prototype.analysis_laser_via_on_buried_hole = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_milling_bit_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_milling_length = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_board_has_attr = function(props){ // board层中检查存在01005属性物件时
GEN.openStep({job:this.job,name:this.pcs_step})
GEN.clearLayers()
GEN.affectedLayer({affected:'yes',layer:this.matrixInfo.mBoardLayer,clear_before:'yes'});
GEN.selClearFeature()
GEN.selectByFilter({attribute:props})
var res = GEN.getSelectCount() > 0? "yes" : "no"
GEN.affectedLayer({affected:'no',mode:'all'});
GEN.selClearFeature()
GEN.closeStep()
return res
}
T_m_p.prototype.analysis_vc_src_EDGE_PLATING = function(props){ // ? 检查线路外形是否存在物件,存在则存yes
var res = "no"
var rout = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "rout"}) // 找rout层
if(rout.length == 0){
return "error:cant find rout layer"
}
GEN.openStep({job:this.job, name:this.pcs_step})
GEN.affectedLayer({affected:'no',mode:'all'})
try {
this.matrixInfo.mSignals.forEach(function(v){ // 用线路层逐层与rout层touch 找得到说明存在
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:rout[0].name,mode:"touch",use:"filter"})
if( GEN.getSelectCount()>0){
throw "yes"
}
GEN.clearLayers()
})
} catch (msg) {
res = msg
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.selClearFeature()
}
GEN.closeStep()
return res
}
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_glod_finger_area = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_solder_mask_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"
if(solder_paste_info.length == 0){
res = "none"
} else if (solder_paste_info.length == 1) {
res = /top/ig.test(solder_paste_info[0]) ? "top" : "bot"
} else {
res = "both"
}
return res
}
T_m_p.prototype.analysis_silk_screen_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"
if(solder_mask_info.length == 0){
res = "none"
} else if (solder_mask_info.length == 1) {
res = /top/ig.test(solder_mask_info[0]) ? "top" : "bot"
} else {
res = "both"
}
return res
}
T_m_p.prototype.analysis_min_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_pth_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_npth_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_min_slot_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_slot_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_slot_drl_length = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_spec_slot_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_spec_slot_drl_length = function(){ // todo
return "_todo"
}
return new T_m_p({job:job, jobId:jobId, pcs_step:pcs_step, array_step:array_step,matrix:matrix})
}
function smdAnalysis(props){
var job = props.job
var steplist = props.steplist
var layers = props.layers
var res = {}
steplist.forEach(function(step){
GEN.openStep({job:job,step:step})
layers.forEach(function(layer){
// 计算开窗 数量
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
if (!res.hasOwnProperty(layer.solderL)){
res[layer.solderL] = {}
}
if(GEN.getProfile({job:job, step:step}).match(/\n/ig).length > 1){
GEN.selectByFilter({profile:'in'})
} else {
GEN.selAllFeat()
}
res[layer.solderL].sm_opening_count = GEN.getSelectCount()
GEN.selClearFeature()
}
// 分析最小smd宽高
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({attribute:props.attr})
var selCount = GEN.getSelectCount()
if(selCount>0){
var tmp_layer = layer.signalL + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step})
GEN.workLayer({name:tmp_layer,display_number:2,clear_before:'yes'})
var symbolInfo = symbolAnalysis({symbols:symbols,filterReg:/^rect/})
if (!res.hasOwnProperty(layer.signalL)){
res[layer.signalL] = {}
}
if(symbolInfo["min_width"]){ res[layer.signalL]["min_smd_width"] = symbolInfo["min_width"] }
if(symbolInfo["min_length"]){ res[layer.signalL]["min_smd_length"] = symbolInfo["min_length"] }
// 分析最小smd间距
// 创建一个checklist并且分析
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
// 分析开窗宽高
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'})
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'cover'})
var solderL_tmp = layer.solderL + "_tmp"
selCopyLayer({job:job,layer:solderL_tmp})
GEN.selClearFeature()
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"]}
GEN.deleteLayer({job:job,layer:solderL_tmp})
}
GEN.deleteLayer({job:job,layer:tmp_layer})
}
})
GEN.closeStep()
})
return res
}
function symbolAnalysis(props){
var symbols = Object.keys(props.symbols).reduce(function(a,b){
if(props.filterReg.test(b)){
var res = /^rect(\d+\.\d+|\d+)x(\d+\.\d+|\d+)/ig.exec(b).slice(1)
var num1 = res[0], num2 = res[1]
if(num1<=num2){
a.width.push(num1)
a.length.push(num2)
} else {
a.width.push(num2)
a.length.push(num1)
}
}
return a
},{width:[],length:[]})
var min_width,min_length;
if(symbols.width.length){
min_width = symbols.width.reduce(function(a,b){return b-a > 0 ? a : b})
}
if(symbols.length.length){
min_length = symbols.length.reduce(function(a,b){return b-a > 0 ? a : b})
}
return {
min_width:min_width<min_length? min_width :min_length,
min_length:min_width<min_length? min_length :min_width
}
}
function smdPitch(props){
var job = props.job
var step = props.step
var layer = props.layer
var ck = "tmp_chk"
if(GEN.isChklistExists({job:job,step:step,chklist:ck})){
GEN.COM("chklist_delete", { chklist: ck })
}
// 创建并运行
var tmpItem = {
name: "smdPitch",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes",
pp_tests: "Spacing\\;SMD",
pp_check_missing_pads_for_drills:"Yes"
}
}
if(PAR.erf && PAR.erf != ""){
tmpItem.erf = PAR.erf
}
GEN.createChklist({ // 创建checklist
chklist: ck,
items: [tmpItem]
})
GEN.chklistShow({ chklist: ck })
GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" })
GEN.chklistRun({
chklist: ck,
nact: 1,
area: 'profile'
})
var tmp_layer1 = "mk_1_"+layer+"_pitch"
var tmp_layer2 = "ms_1_"+layer+"_pitch"
if(GEN.isLayerExists({job:job,layer:tmp_layer1})){
GEN.deleteLayer({job:job,layer:tmp_layer1})
}
if(GEN.isLayerExists({job:job,layer:tmp_layer2})){
GEN.deleteLayer({job:job,layer:tmp_layer2})
}
GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch");
GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'});
GEN.selectByFilter({attribute:[{attribute:".string",text:"smd_pitch"}]})
var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var features = GEN.getFeatures({job:job,step:step,layer:tmp_layer})
// 获取最小smd间距
var tmp = features.map(function(v){
var num = Math.sqrt((v.xe-v.xs)*(v.xe-v.xs) + (v.ye-v.ys)*(v.ye-v.ys))*1000
return num.toFixed(4)
})
var res = tmp.sort(function(a,b){return a-b})[0]
GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2})
return res
}
function createChklistAndRun(par) {
var checkLayers = par.layers
var items = par.items
GEN.createChklist({ // 创建checklist
chklist: oChecklistName,
items: items
})
GEN.chklistShow({
chklist: oChecklistName
})
GEN.affectedLayer({
affected: "yes",
layer: checkLayers,
clear_before: "yes"
})
items.forEach(function(v){
GEN.chklistRun({
chklist: oChecklistName,
nact: v.nact,
area: 'profile'
})
})
}
function analysisChkAttr(par) {
var layers = par.layers;
var hash = {};
var info = par.info;
var job = par.job;
var oChecklistName = par.oChecklistName
layers.forEach(function (v) {
hash[v] = {}
Object.keys(info).forEach(function (key) {
var val = info[key]
hash[v][key] = val.reduce(function (a, type) {
var tmp = GEN.getCheckAttr({
job: job,
step: par.step,
checklist: oChecklistName,
nact: 1,
attr: v + "_min_" + type
})
if (a === "N/A" && /\d+/.test(tmp)) {
a = tmp
}
if (/\d+/.test(a) && /\d+/.test(tmp) && Number(tmp) < Number(a)) {
a = tmp
}
return a
}, "N/A")
})
})
return hash
}
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()
var res = par.map(function(drill){
GEN.affectedLayer({affected:"yes",layer:drill.layer,clear_before:"yes",mode:"all"})
GEN.selClearFeature()
GEN.selectByFilter({feat_types:"pad",include_syms:drill.symbol})
// 拷贝到_tmp
var tmplayer = drill.layer + "_tmp"
if(GEN.isLayerExists({job:job,layer:tmplayer})){GEN.deleteLayer({job:job,step:step,layer:tmplayer})}
GEN.selCopyOther({dest:"layer_name",target_layer:tmplayer})
GEN.affectedLayer({affected:"no",mode:"all"})
GEN.selClearFeature();
[drill.start,drill.end].forEach(function(item, i){
GEN.workLayer({name:item,display_number:1,clear_before:"yes"})
// GEN.selRefFeat({
// layers: tmplayer,
// use: "filter",
// mode: "touch",
// f_types: "pad",
// pads_as:"shape",
// polarity:"positive",
// include_syms:drill.symbol,
// filter: {
// feat_types:'pad'
// }
// })
GEN.COM("sel_ref_feat",
{layers:tmplayer,use:"filter",mode:"touch",pads_as:"shape",f_types:"pad",polarity:"positive\;negative",include_syms:drill.symbol})
var res = ""
var pads = GEN.getFeatures({job:job,step:step,layer:item,options:"select"})
if(pads && pads.length) {
pads = pads.filter(function(item){
return /^r\d+/.test(item.symbol)
})
pads = pads.sort(function(a,b){
return parseInt(a.symbol) - parseInt(b.symbol)
})
res = pads[0].symbol.slice(1)
}
if ( i == 0) {
drill.drl_pad_top = res
} else if (i==1){
drill.drl_pad_bot = res
}
})
GEN.deleteLayer({job:job,step:step,layer:tmplayer})
return drill
})
return res
}
function bgaAnalysis(props){
var job = props.job
var steplist = props.steplist
var layers = props.layers;
GEN.clearLayers()
GEN.affectedLayer({affected:'yes',layer:layers.map(function(v){return v.signalL})})
GEN.selectByFilter({attribute:props.attr})
var count = GEN.getSelectCount()
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.selClearFeature()
if(count == 0 ) {
return {}
}
var res = {}
steplist.forEach(function(step){
GEN.openStep({job:job,step:step})
layers.forEach(function(layer){
// 找出bga 拷贝到辅助层
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({attribute:props.attr})
var selCount = GEN.getSelectCount()
if(selCount>0){
var tmp_layer = layer.signalL + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step})
GEN.workLayer({name:tmp_layer,display_number:2,clear_before:'yes'})
// 分析数据
var syblist = _.values(symbols).reduce(function(a,b){
if (b.pad > 0 && b.line) {
a.push({symbol:b.symbol, size:Number(b.size)})
}
return a
},[])
// 找到最小的bga分析
var min_symbols = syblist.sort(function(a,b){return a.size-b.size})[0]
var min_symbols_info = min_symbols_anal({symbols:min_symbols, job:job, step:step, layer:layer})
if (!res.hasOwnProperty(layer.signalL)){
res[layer.signalL] = {}
}
res[layer.signalL].min_bga_size = min_symbols_info["min_bga_size"]
res[layer.signalL].min_bga_openging_size = min_symbols_info["min_bga_openging_size"]
res[layer.signalL].min_bga_pitch = min_symbols_info["min_bga_pitch"]
// 分析所有BGA
var all_bga_min_pitch_info = all_bga_min_pitch_anal({job:job, step:step, layer:tmp_layer,solderLayer:layer.solderL})
res[layer.signalL].bga_min_pitch = all_bga_min_pitch_info["bga_min_pitch"]
res[layer.signalL].bga_min_pitch_pad_size = all_bga_min_pitch_info["bga_min_pitch_pad_size"]
res[layer.signalL].bga_min_pitch_openging_size = all_bga_min_pitch_info["bga_min_pitch_openging_size"]
GEN.deleteLayer({job:job,layer:tmp_layer})
}
})
GEN.closeStep()
})
console.log(res);
return res
}
function min_symbols_anal(props){ // 分析最 symbols
var job = props.job
var step = props.step
var layer = props.layer
var symbols = props.symbols
var res = {}
GEN.selClearFeature()
GEN.selectByFilter({include_syms:symbols.symbol})
var tmp_layer = layer.signalL + "_tmp_1"
selCopyLayer({job:job,layer:tmp_layer})
// 分析数据
// 尺寸
res.min_bga_size = symbols.size
// 开窗大小
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'})
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'cover'})
var solderL_tmp = layer.solderL + "_tmp"
selCopyLayer({job:job,layer:solderL_tmp})
GEN.selClearFeature()
GEN.workLayer({name:solderL_tmp,display_number:2,clear_before:"yes"})
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step})
res.min_bga_openging_size = _.values(symbols_solder).reduce(function(a,b){
if (b.pad > 0 && b.line) {
if(/^rect|^oval/.test(b.symbol)){
b.size = b.width < b.height ? b.width : b.height
}
if(b.size) {
a.push({symbol:b.symbol, size:Number(b.size)})
}
}
return a
},[]).sort(function(a,b){return a.size-b.size})[0].size
GEN.deleteLayer({job:job,layer:solderL_tmp})
}
// 间距
res.min_bga_pitch = bgaPitch({job:job,step:step,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer})
return res
}
function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的
var job = props.job
var step = props.step
var layer = props.layer
var symbols = props.symbols
var solder_layer = props.solderLayer
var res = {}
var ck = "tmp_chk"
if(GEN.isChklistExists({job:job,step:step,chklist:ck})){
GEN.COM("chklist_delete", { chklist: ck })
}
// 创建并运行
var tmpItem = {
name: "bgaPitch",
nact: 1,
action: "valor_analysis_signal",
erf: PAR.erf,
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes",
pp_tests: "Spacing",
pp_check_missing_pads_for_drills:"Yes"
}
}
if(PAR.erf){
tmpItem.erf = PAR.erf
}
GEN.createChklist({ // 创建checklist
chklist: ck,
items: [tmpItem]
})
GEN.chklistShow({ chklist: ck })
GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" })
GEN.chklistRun({
chklist: ck,
nact: 1,
area: 'profile'
})
var tmp_layer1 = "mk_1_"+layer+"_pitch"
var tmp_layer2 = "ms_1_"+layer+"_pitch"
if(GEN.isLayerExists({job:job,layer:tmp_layer1})){
GEN.deleteLayer({job:job,layer:tmp_layer1})
}
if(GEN.isLayerExists({job:job,layer:tmp_layer2})){
GEN.deleteLayer({job:job,layer:tmp_layer2})
}
GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch");
GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'});
GEN.selectByFilter({attribute:[{attribute:".string",text:"bga_pitch"}]})
var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step})
// 获取最小smd间距
var min_symbol = _.values(symbols).sort(function(a,b){return Number(a.size)-Number(b.size)})[0]
res.bga_min_pitch = min_symbol.size
// 所有BGA中间距最小的PAD大小
GEN.selClearFeature()
GEN.selectByFilter({include_syms:min_symbol.symbol})
var min_pitch_layer = tmp_layer + "_min"
selCopyLayer({job:job,layer:min_pitch_layer})
GEN.workLayer({name:layer,display_number:1,clear_before:'yes'});
GEN.selClearFeature()
GEN.selRefFeat({layers:min_pitch_layer,use:'filter',mode:'touch'})
var min_pad_layer = layer + "_min_pad"
selCopyLayer({job:job,layer:min_pad_layer})
GEN.workLayer({name:min_pad_layer,display_number:1,clear_before:'yes'});
var min_pad_symbols = GEN.getLayerSymsHist({job:job,layer:min_pad_layer,step:step})
var min_pad_symbol = _.values(min_pad_symbols).sort(function(a,b){return Number(a.size)-Number(b.size)})[0]
res.bga_min_pitch_pad_size = min_pad_symbol.size
if(solder_layer){
// 最小pitch开窗大小
GEN.workLayer({name:solder_layer,display_number:1,clear_before:'yes'});
GEN.selClearFeature()
GEN.selRefFeat({layers:min_pitch_layer,use:'filter',mode:'touch'})
var solder_layer_tmp = solder_layer + "_tmp"
selCopyLayer({job:job,layer:solder_layer_tmp})
GEN.selClearFeature()
GEN.workLayer({name:solder_layer_tmp,display_number:2,clear_before:"yes"})
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solder_layer_tmp,step:step})
var symbols_solder_list = _.values(symbols_solder).filter(function(v){return /\d+/ig.test(v.size)})
if(symbols_solder_list.length){
res.bga_min_pitch_openging_size = symbols_solder_list.sort(function(a,b){return Number(a.size)-Number(b.size)})[0].size
}
GEN.deleteLayer({job:job,layer:solder_layer_tmp})
}
GEN.deleteLayer({job:job,layer:min_pad_layer})
GEN.deleteLayer({job:job,layer:min_pitch_layer})
GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2})
return res
}
function bgaPitch(props){
var job = props.job
var step = props.step
var layer = props.layer
var ck = "tmp_chk"
if(GEN.isChklistExists({job:job,step:step,chklist:ck})){
GEN.COM("chklist_delete", { chklist: ck })
}
// 创建并运行
var tmpItem = {
name: "bgaPitch",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes",
pp_tests: "Spacing",
pp_check_missing_pads_for_drills:"Yes"
}
}
if(PAR.erf) {
tmpItem.erf = PAR.erf
}
GEN.createChklist({ // 创建checklist
chklist: ck,
items: [tmpItem]
})
GEN.chklistShow({ chklist: ck })
GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" })
GEN.chklistRun({
chklist: ck,
nact: 1,
area: 'profile'
})
var tmp_layer1 = "mk_1_"+layer+"_pitch"
var tmp_layer2 = "ms_1_"+layer+"_pitch"
if(GEN.isLayerExists({job:job,layer:tmp_layer1})){
GEN.deleteLayer({job:job,layer:tmp_layer1})
}
if(GEN.isLayerExists({job:job,layer:tmp_layer2})){
GEN.deleteLayer({job:job,layer:tmp_layer2})
}
GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch");
GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'});
GEN.selectByFilter({attribute:[{attribute:".string",text:"bga_pitch"}]})
var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var features = GEN.getFeatures({job:job,step:step,layer:tmp_layer})
var tmp = features.map(function(v){
var num = Math.sqrt((v.xe-v.xs)*(v.xe-v.xs) + (v.ye-v.ys)*(v.ye-v.ys))*1000
return num.toFixed(4)
})
var res = tmp.sort(function(a,b){return a-b})[0]
GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2})
// 矩阵
return res
}
function hasAttr(props){ // 判断层 有没有部分属性
var job = props.job // 有没有smd和bga属性的物件
var attr = props.attr
var step = props.step
var res = false
try {
var layers = props.layers
GEN.openStep({job:job,name:step})
for (var i = 0;i <layers.length;i++){
var layer = layers[i]
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({attribute:attr})
var count = GEN.getSelectCount()
if(count && count > 0){
throw true
}
}
GEN.clearLayers()
GEN.closeStep()
}
catch (msg) {
res = msg
GEN.clearLayers()
GEN.closeStep()
}
return res
}
function tmp(){
return {
"sst": {
"row": "1","type": "solder_paste","name": "sp_fr","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -1000,"tl_name": "sp_fr","tl_type": "solder_paste","odb_name": "sst","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top",
"row_num": -1000,"odb_row_num": "1"
},
"spt": {
"row": "2","type": "solder_paste","name": "sp_fr(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -999,"tl_name": "sp_fr(2)","tl_type": "solder_paste","odb_name": "spt","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top",
"row_num": -999,"odb_row_num": "2"
},
"smt": {
"row": "3","type": "solder_mask","name": "sm_fr","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -998,"tl_name": "sm_fr","tl_type": "solder_mask","odb_name": "smt","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "top",
"row_num": -998,"odb_row_num": "3"
},
"top": {
"row": "4","type": "outer","name": "top","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1,"tl_name": "top","tl_type": "outer","odb_name": "top","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "top",
"row_num": 1,"odb_row_num": "4"
},
"isl2": {
"row": "5","type": "inner","name": "l2","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 2,"tl_name": "l2","tl_type": "inner","odb_name": "isl2","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 2,"odb_row_num": "5"
},
"isl3": {
"row": "6","type": "inner","name": "l3","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 3,"tl_name": "l3","tl_type": "inner","odb_name": "isl3","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 3,"odb_row_num": "6"
},
"isl4": {
"row": "7","type": "inner","name": "l4","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 4,"tl_name": "l4","tl_type": "inner","odb_name": "isl4","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 4,"odb_row_num": "7"
},
"isl5": {
"row": "8","type": "inner","name": "l5","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 5,"tl_name": "l5","tl_type": "inner","odb_name": "isl5","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 5,"odb_row_num": "8"
},
"isl6": {
"row": "9","type": "inner","name": "l6","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 6,"tl_name": "l6","tl_type": "inner","odb_name": "isl6","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 6,"odb_row_num": "9"
},
"isl7": {
"row": "10","type": "inner","name": "l7","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 7,"tl_name": "l7","tl_type": "inner","odb_name": "isl7","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 7,"odb_row_num": "10"
},
"isl8": {
"row": "11","type": "inner","name": "l8","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 8,"tl_name": "l8","tl_type": "inner","odb_name": "isl8","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 8,"odb_row_num": "11"
},
"isl9": {
"row": "12","type": "inner","name": "l9","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 9,"tl_name": "l9","tl_type": "inner","odb_name": "isl9","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 9,"odb_row_num": "12"
},
"bottom": {
"row": "13","type": "outer","name": "bottom","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 10,"tl_name": "bottom","tl_type": "outer","odb_name": "bottom","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "bottom",
"row_num": 10,"odb_row_num": "13"
},
"smb": {
"row": "14","type": "solder_mask","name": "sm_ba","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1013,"tl_name": "sm_ba","tl_type": "solder_mask","odb_name": "smb","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1013,"odb_row_num": "14"
},
"spb": {
"row": "15","type": "solder_paste","name": "sp_ba","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1014,"tl_name": "sp_ba","tl_type": "solder_paste","odb_name": "spb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1014,"odb_row_num": "15"
},
"ssb": {
"row": "16","type": "solder_paste","name": "sp_ba(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1015,"tl_name": "sp_ba(2)","tl_type": "solder_paste","odb_name": "ssb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1015,"odb_row_num": "16"
},
"d1-2": {
"row": "17","type": "laser_drill","name": "d1-2","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top",
"drl_end": "isl2","gdrl_start": "top","gdrl_end": "isl2","drl_start_num": "1","drl_end_num": "2","tl_name": "drill1-2","tl_type": "drill",
"tl_num": 10016,"odb_name": "d1-2","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10016,"odb_row_num": "17","drl_from_num": "1","drl_to_num": "2"
},
"d2-3": {
"row": "18","type": "laser_drill","name": "d2-3","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl2","drl_end": "isl3","gdrl_start": "isl2","gdrl_end": "isl3","drl_start_num": "2","drl_end_num": "3","tl_name": "drill2-3","tl_type": "drill",
"tl_num": 10017,"odb_name": "d2-3","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10017,"odb_row_num": "18","drl_from_num": "2","drl_to_num": "3"
},
"d3-4": {
"row": "19","type": "laser_drill","name": "d3-4","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl3","drl_end": "isl4","gdrl_start": "isl3","gdrl_end": "isl4","drl_start_num": "3","drl_end_num": "4","tl_name": "drill3-4","tl_type": "drill",
"tl_num": 10018,"odb_name": "d3-4","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10018,"odb_row_num": "19","drl_from_num": "3","drl_to_num": "4"
},
"d4-5": {
"row": "20","type": "laser_drill","name": "d4-5","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl4","drl_end": "isl5","gdrl_start": "isl4","gdrl_end": "isl5","drl_start_num": "4","drl_end_num": "5","tl_name": "drill4-5","tl_type": "drill",
"tl_num": 10019,"odb_name": "d4-5","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10019,"odb_row_num": "20","drl_from_num": "4","drl_to_num": "5"
},
"d5-6": {
"row": "21","type": "laser_drill","name": "d5-6","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl5","drl_end": "isl6","gdrl_start": "isl5","gdrl_end": "isl6","drl_start_num": "5","drl_end_num": "6","tl_name": "drill5-6","tl_type": "drill",
"tl_num": 10020,"odb_name": "d5-6","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10020,"odb_row_num": "21","drl_from_num": "5","drl_to_num": "6"
},
"d6-7": {
"row": "22","type": "laser_drill","name": "d6-7","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl6","drl_end": "isl7","gdrl_start": "isl6","gdrl_end": "isl7","drl_start_num": "6","drl_end_num": "7","tl_name": "drill6-7","tl_type": "drill",
"tl_num": 10021,"odb_name": "d6-7","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10021,"odb_row_num": "22","drl_from_num": "6","drl_to_num": "7"
},
"d7-8": {
"row": "23","type": "laser_drill","name": "d7-8","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl7","drl_end": "isl8","gdrl_start": "isl7","gdrl_end": "isl8","drl_start_num": "7","drl_end_num": "8","tl_name": "drill7-8","tl_type": "drill",
"tl_num": 10022,"odb_name": "d7-8","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10022,"odb_row_num": "23","drl_from_num": "7","drl_to_num": "8"
},
"d8-9": {
"row": "24","type": "laser_drill","name": "d8-9","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl8","drl_end": "isl9","gdrl_start": "isl8","gdrl_end": "isl9","drl_start_num": "8","drl_end_num": "9","tl_name": "drill8-9","tl_type": "drill",
"tl_num": 10023,"odb_name": "d8-9","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10023,"odb_row_num": "24","drl_from_num": "8","drl_to_num": "9"
},
"d9-10": {
"row": "25","type": "laser_drill","name": "d9-10","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl9","drl_end": "bottom","gdrl_start": "isl9","gdrl_end": "bottom","drl_start_num": "9","drl_end_num": "10","tl_name": "drill9-10","tl_type": "drill",
"tl_num": 10024,"odb_name": "d9-10","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10024,"odb_row_num": "25","drl_from_num": "9","drl_to_num": "10"
},
"drill": {
"row": "26","type": "main_drill","name": "drill","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","drl_start_num": 1,"drl_end_num": 10,"tl_name": "drill","tl_type": "drill",
"tl_num": 10025,"odb_name": "drill","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10025,"odb_row_num": "26","drl_from_num": 1,"drl_to_num": 10
},
"rout": {
"row": "27","type": "other","name": "__rout__","context": "board","layer_type": "rout","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","odb_name": "rout","odb_context": "board","odb_type": "rout","odb_polarity": "positive","odb_side": "none","odb_row_num": "27"
},
"nclegend-1-2": {
"row": "28","type": "other","name": "__nclegend-1-2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110027,"odb_name": "nclegend-1-2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110027,"odb_row_num": "28"
},
"nclegend-2-3": {
"row": "29","type": "other","name": "__nclegend-2-3__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110028,"odb_name": "nclegend-2-3","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110028,"odb_row_num": "29"
},
"nclegend-3-4": {
"row": "30","type": "other","name": "__nclegend-3-4__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110029,"odb_name": "nclegend-3-4","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110029,"odb_row_num": "30"
},
"nclegend-4-5": {
"row": "31","type": "other","name": "__nclegend-4-5__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110030,"odb_name": "nclegend-4-5","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110030,"odb_row_num": "31"
},
"nclegend-5-6": {
"row": "32","type": "other","name": "__nclegend-5-6__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110031,"odb_name": "nclegend-5-6","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110031,"odb_row_num": "32"
},
"nclegend-6-7": {
"row": "33","type": "other","name": "__nclegend-6-7__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110032,"odb_name": "nclegend-6-7","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110032,"odb_row_num": "33"
},
"nclegend-7-8": {
"row": "34","type": "other","name": "__nclegend-7-8__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110033,"odb_name": "nclegend-7-8","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110033,"odb_row_num": "34"
},
"nclegend-8-9": {
"row": "35","type": "other","name": "__nclegend-8-9__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110034,"odb_name": "nclegend-8-9","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110034,"odb_row_num": "35"
},
"nclegend-9-10": {
"row": "36","type": "other","name": "__nclegend-9-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110035,"odb_name": "nclegend-9-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110035,"odb_row_num": "36"
},
"nclegend-1-10": {
"row": "37","type": "other","name": "__nclegend-1-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110036,"odb_name": "nclegend-1-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110036,"odb_row_num": "37"
},
"outline": {
"row": "38","type": "other","name": "__outline__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110037,"odb_name": "outline","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110037,"odb_row_num": "38"
},
"top_assem": {
"row": "39","type": "other","name": "__top_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110038,"odb_name": "top_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110038,"odb_row_num": "39"
},
"bot_assem": {
"row": "40","type": "other","name": "__bot_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110039,"odb_name": "bot_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110039,"odb_row_num": "40"
},
"top_testpoint": {
"row": "41","type": "other","name": "__top_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110040,"odb_name": "top_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110040,"odb_row_num": "41"
},
"bot_testpoint": {
"row": "42","type": "other","name": "__bot_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110041,"odb_name": "bot_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110041,"odb_row_num": "42"
},
"top_osp": {
"row": "43","type": "other","name": "__top_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110042,"odb_name": "top_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110042,"odb_row_num": "43"
},
"bot_osp": {
"row": "44","type": "other","name": "__bot_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110043,"odb_name": "bot_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110043,"odb_row_num": "44"
},
"top_enig": {
"row": "45","type": "other","name": "__top_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110044,"odb_name": "top_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110044,"odb_row_num": "45"
},
"bot_enig": {
"row": "46","type": "other","name": "__bot_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110045,"odb_name": "bot_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110045,"odb_row_num": "46"
},
"fab_page2": {
"row": "47","type": "other","name": "__fab_page2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110046,"odb_name": "fab_page2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110046,"odb_row_num": "47"
},
"tmp_top_shorts": {
"row": "48","type": "other","name": "__tmp_top_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110047,"odb_name": "tmp_top_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110047,"odb_row_num": "48"
},
"tmp_bot_shorts": {
"row": "49","type": "other","name": "__tmp_bot_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110048,"odb_name": "tmp_bot_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110048,"odb_row_num": "49"
},
"bot_assy_mate": {
"row": "50","type": "other","name": "__bot_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110049,"odb_name": "bot_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110049,"odb_row_num": "50"
},
"outline+1": {
"row": "51","type": "other","name": "__outline+1__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110050,"odb_name": "outline+1","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110050,"odb_row_num": "51"
},
"top_assy_mate": {
"row": "52","type": "other","name": "__top_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110051,"odb_name": "top_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110051,"odb_row_num": "52"
}
}
}
function tmp_2(){
return {
"cad": {
"d1-2": {
"1": {
"count": "06896",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d2-3": {
"1": {
"count": "07430",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d3-4": {
"1": {
"count": "06866",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d4-5": {
"1": {
"count": "06413",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d5-6": {
"1": {
"count": "08938",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d6-7": {
"1": {
"count": "09057",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d7-8": {
"1": {
"count": "07818",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d8-9": {
"1": {
"count": "09126",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"d9-10": {
"1": {
"count": "08498",
"num": "1",
"type": "via",
"min_tol": "2.756",
"max_tol": "0.984",
"finish_size": "2.756",
"drill_size": "2.756",
"slot_len": "0",
"type2": "laser",
"shape": "hole",
"bit": 0
}
},
"drill": {
"1": {
"count": "05",
"num": "1",
"type": "non_plated",
"min_tol": "3.15",
"max_tol": "3.15",
"finish_size": "15.748",
"drill_size": "15.748",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"2": {
"count": "01",
"num": "2",
"type": "non_plated",
"min_tol": "0",
"max_tol": "1.969",
"finish_size": "35.039",
"drill_size": "35.039",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"3": {
"count": "01",
"num": "3",
"type": "non_plated",
"min_tol": "3.15",
"max_tol": "3.15",
"finish_size": "35.039",
"drill_size": "35.039",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"4": {
"count": "01",
"num": "4",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "47.244",
"drill_size": "47.244",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"5": {
"count": "05",
"num": "5",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "59.055",
"drill_size": "59.055",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"6": {
"count": "01",
"num": "6",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "70.866",
"drill_size": "70.866",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
},
"7": {
"count": "01",
"num": "7",
"type": "non_plated",
"min_tol": "1.969",
"max_tol": "1.969",
"finish_size": "74.803",
"drill_size": "74.803",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
}
}
},
"stp": {
"d1-2": {},
"d2-3": {},
"d3-4": {},
"d4-5": {},
"d5-6": {},
"d6-7": {},
"d7-8": {},
"d8-9": {},
"d9-10": {},
"drill": {
"1": {
"count": "08",
"num": "1",
"type": "non_plated",
"min_tol": "0",
"max_tol": "1.969",
"finish_size": "118.11",
"drill_size": "118.11",
"slot_len": "0",
"type2": "standard",
"shape": "hole",
"bit": 0
}
}
}
}
}
\ No newline at end of file
/*
NAME:
DESCRIPTION: 客户数据分析
PARAMETER:
[
{
name : 'pcs_step',
title : 'pcsStep名',
type : 'LineEdit',
property : {tool_tip : 'pcs step名,默认是cad'}
},
{
name : 'array_step',
title : 'arrayStep名',
type : 'LineEdit',
property : {tool_tip : 'array step名,默认是stp'}
},
{
name : 'erf',
title : 'erf名称',
type : 'LineEdit',
property : {tool_tip : 'erf名称'}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 客户数据分析</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 客户参数 </p>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
*/
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var JobId = $.job_id;
var database = require("topsin.database");
var Omatrix = {};
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title
},
where: { id: $.task_id }
});
}
var GEN = $.gen;
var Job = $.job_name;
var db = $.db;
var Status = 'ok';
var resultData = [];
var PAR = {};
if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
try {
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" }
// 检查料号是否能够check out
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
var pcs_step = par.pcs_step == "" ? "cad" : par.pcs_step;
var array_step = par.array_step == "" ? "stp" : par.array_step;
var step_list = GEN.getStepList({job:job})
if(step_list.indexOf(array_step)<0){
array_step = false
}
if(step_list.indexOf(pcs_step)<0){
pcs_step = step_list[0]
}
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
GEN.openStep({job:job, name:pcs_step})
_.values(matrix).forEach(function(v){
if(v.context == "board" && v.layer_type == "drill"){
if(v.type == "laser_drill"){
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selAllFeat()
if(GEN.getSelectCount()>0){
GEN.COM("cur_atr_set,attribute=.drill,option=via")
GEN.COM("sel_change_atr,mode=add")
}
GEN.clearLayers()
GEN.selClearFeature()
} else if(v.type == "main_drill" || v.type == "blind_drill" || v.type == "bury_drill") {
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:v.drl_start,use:'filter',mode:'touch',f_types:"pad"})
GEN.selRefFeat({layers:v.drl_end,use:'filter',mode:'touch',f_types:"pad"})
if(GEN.getSelectCount()>0){
GEN.COM("cur_atr_set,attribute=.drill,option=plated")
GEN.COM("sel_change_atr,mode=add")
}
GEN.selReverse()
if(GEN.getSelectCount() > 0){
GEN.COM("cur_atr_set,attribute=.drill,option=non_plated")
GEN.COM("sel_change_atr,mode=add")
}
}
}
})
GEN.closeStep()
console.log("===================>steplist:"+_.toString(step_list))
if(step_list.indexOf(pcs_step)<0){throw "can not find pcsstep"}
if(step_list.indexOf(array_step)<0){array_step = false}
console.log("===================================> 1matrix")
var analysis_obj = analysis({job:job,jobId:JobId,pcs_step:pcs_step,array_step:array_step,matrix:matrix})
// 创建profile
var tmp_matrix = GEN.getMatrix({job:job})
var board_layer = Object.keys(tmp_matrix).filter(function(v){
return tmp_matrix[v].context == "board"
})
GEN.openStep({job:job, name:pcs_step})
var now_profile = GEN.getProfile({job:job, step:pcs_step})
console.log("profile:===============>"+now_profile);
console.log(now_profile.match(/\n/ig).length);
if(now_profile.match(/\n/ig).length == 1){ // 如果没有profile
var alllayers = Object.keys(matrix)
if (alllayers.indexOf("outline") >= 0){ // 如果有outline层
GEN.affectedLayer({ affected: 'no', mode: 'all' })
GEN.clearLayers()
GEN.workLayer({name:'outline',display_number:2,clear_before:'yes'})
GEN.selectByFilter({feat_types:'line\;arc'})
var count = GEN.getSelectCount()
if(count > 0) {
GEN.selCreateProfile()
}
GEN.clearLayers()
console.log("create profile ok");
}
}
GEN.affectedLayer({affected:'yes',layer: board_layer, clear_before:"yes"})
GEN.selectByFilter({profile:"out"})
if(GEN.getSelectCount() > 0){
GEN.selDelete()
}
GEN.closeStep()
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 // ? 保留小数
vc_pcs_count_on_panel: true, // todo 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
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层
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:检查文字层所在面次
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圆孔
min_slot_drl_size: true, // todo 0.8mm 最小槽孔
max_slot_drl_size: true, // todo 1.2mm 最大槽孔
max_slot_drl_length: true, // todo 2.0mm 最大槽孔
max_spec_slot_drl_size: true, // todo 2.1mm 最大异形槽孔
max_spec_slot_drl_length: true, // todo 3.0mm 最大异形槽孔
}
}
console.log("================== ================> 2analysis_obj")
// 分析料号info
var jobInfo = {}
Object.keys(config.jobInfo).forEach(function(key){
var props = config.jobInfo[key];
console.log("===================================> 2analysis_obj:key:"+key)
if(props){
try {
if(props.hasOwnProperty("api") && props.hasOwnProperty("props")){
jobInfo[key] = analysis_obj["analysis_"+props.api](props.props)
} else if(props.only_value){
jobInfo[key] = analysis_obj.jobInfo[key]
} else {
jobInfo[key] = analysis_obj["analysis_"+key](props)
}
} catch (e) {
console.log(e);
jobInfo[key] = "_error"
}
}
})
console.log("===================================> 3 jobinfo")
// 过滤掉料号信息的 _todo 和 _error
for (var key in jobInfo) {
if(jobInfo[key]==="yes"){jobInfo[key] = "Yes"}
if(jobInfo[key]==="no"){jobInfo[key] = "No"}
if(jobInfo[key] === "_todo" || jobInfo[key] === "_error"){
delete jobInfo[key]
}
}
console.log("===================================> 4 save job info")
save_job_info({
jobid: JobId,
jobinfohash: jobInfo
})
console.log("===================================> 5 save drill info")
// 获取pcs_step 和 array_step的钻孔信息
var drill_info = {};
var drillLayers = analysis_obj.matrixInfo.mDrills;
[pcs_step, array_step].forEach(function(step){
if(step){
var tmp_step = step + "_tmp"
GEN.matrixCopyStep({job:job,step:tmp_step,step:tmp_step})
GEN.COM("copy_entity",{type:"step",source_job:job,source_name:step,dest_job:job,dest_name:tmp_step})
GEN.openStep({job:job, name: tmp_step})
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})
drill_info[step][layer.name] = layer_tool_manager
})
GEN.closeStep()
GEN.deleteStep({job:job,step:tmp_step})
}
})
var pcs_tool_manager = drill_info[pcs_step];
var array_tool_manager = drill_info[array_step];
Object.keys(pcs_tool_manager).forEach(function(layer){
Object.keys(pcs_tool_manager[layer]).forEach(function(key){
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 data = {
job_id: JobId,
layer_name: layer,
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,
finish_slot_length: tool.slot_len,
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"}
}
if(!array_count){delete data.array_count}
var id = db.query("",function(q){
return q.selectValue({
table:'pdm_job_cam_drill',
field:"id",
where:{job_id:JobId, layer_name: layer,tool_num: key}
})
});
console.log("=========>drillid:"+id)
if(/done/ig.test(id) || !id){
db.query("",function(q){
return q.insertRow({
table:'pdm_job_cam_drill',
data:data,
return_field:'id',
})
});
}else{
db.query("",function(q){
return q.updateRow({
table:'pdm_job_cam_drill',
where: {id:id},
data:data,
update_policy:{tags:'array_append', attr_data:'json_merge'}
})
});
}
})
})
console.log("=========== ===================> 6 set smd bga")
var hasattrs = [".smd",".bga"]
var ishasattrs = hasattrs.reduce(function(a,b){ // 判断是否含有.smd属性
if(!hasAttr({job:job,step:pcs_step,attr:b,layers:analysis_obj.matrixInfo.mOuters})){ a = false }
return a
},true)
if(!ishasattrs){ // 如果找不到.smd 分析.smd
GEN.COM("chklist_single,action=valor_cleanup_set_smd,show=yes")
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_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("chklist_close,chklist=valor_cleanup_set_smd,mode=hide")
}
// GEN.createChklist()
console.log("============= ===============> 6 analysis smd")
// smd
var smdInfo;
try {
if(!analysis_obj.matrixInfo.mOuters[0].solderL){throw "no mask"}
smdInfo = smdAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".smd"})
} catch (msg) {
console.log("smdInfo:error:"+msg)
}
// bga
console.log("===================================> 7 bga info")
var bgaInfo;
// try {
bgaInfo = bgaAnalysis({job:job,steplist:[pcs_step],layers:analysis_obj.matrixInfo.mOuters,attr:".bga"})
// } catch (msg) {
// console.log("bgaInfo:error:"+msg)
// }
console.log("========================bgaInfo:" + _.toString(bgaInfo));
// 保存
console.log("============== =====================> 8 save bga smd info")
var save_info = [smdInfo, analysis_obj.jobInfo.laser_info,bgaInfo]; // 保存 smd 和 bga数据
save_info.forEach(function(item){
if(JSON.stringify(item)!= "{}" && item){
Object.keys(item).forEach(function(key){
var val = item[key]
save_layerinfo({
jobid: JobId,
layer: key,
layerinfohash: val
})
})
}
})
console.log("================================> 9 copper_percent signal drill")
// 分析layer info
var stepList = [pcs_step];
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})
var info = {
min_line_width: ["line","user_nor_line"],
min_line_spacing: ["l2l"],
min_line2pad: ["p2line"],
min_pad2pad: ["p2p", "smd2smd", "smd2pad"],
min_ar: ["ar","pth_ar"]
}
stepList.forEach(function(step){
GEN.openStep({ job: job, name: step })
// 曝光
analysis_obj.matrixInfo.mOuters.forEach(function(item){
if(item.solderL){
var tmp_info = GEN.exposedArea({layer1:item.signalL,mask1:item.solderL})
// {"area":"0.73817","percent":"8.986"}
var tmp_area = tmp_info.area
var tmp_percent = tmp_info.percent + "%"
save_layerinfo({
jobid: JobId,
layer: item.signalL,
layerinfohash: {
ref_layer: item.solderL,
exposed_area: tmp_area
}
})
}
})
GEN.clearLayers()
GEN.affectedLayer({ affected: 'no', mode: 'all' })
// 创建chklist并运行 如果chklist存在先删除
if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) {
GEN.COM("chklist_delete", { chklist: oChecklistName })
}
var tmpitem = {
name: "signal_layer_checks",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes"
}
}
if(par.erf){
tmpitem.erf = par.erf
}
createChklistAndRun({ // 创建checklist并运行
layers: signalLayers,
items: [tmpitem]
})
console.log("================== =================> 11 signals analysis")
// signal层分析结果
var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName})
// 钻孔
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:matrix[v]["drl_start"],end:matrix[v]["drl_end"]}
})
console.log("===================================> 12 Drill analysis")
var drillRes = analysisDrill(drillToSignals,step) // 钻孔分析结果
// 数据入库
Object.keys(res).forEach(function(key){
var val = res[key]
save_layerinfo({
jobid: JobId,
layer: key,
layerinfohash: val
})
})
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,
}
})
})
// 铜面积
console.log("===================================> 13 save copper_percent")
// 创建profile
var new_martix = GEN.getMatrix({job:job})
var profileLayer = Object.keys(new_martix).filter(function(v){
return new_martix[v].layer_type=="rout" && new_martix[v].context == "board"
})
if(profileLayer.length){
if(GEN.getProfile({job:job, step:pcs_step}).match(/\n/ig).length == 1){ // 如果没有profile
var tmp = profileLayer[0]
if(profileLayer.indexOf("outline")>=0){tmp = "outline"}
GEN.openStep({job:job,name:pcs_step})
GEN.workLayer({name:tmp,display_number:2,clear_before:'yes'})
GEN.selectByFilter({feat_types:'line\;arc'})
var count = GEN.getSelectCount()
if(count > 0){
GEN.selCreateProfile()
GEN.selClearFeature()
} else if(profileLayer.length > 1) {
GEN.workLayer({name:"rout",display_number:2,clear_before:'yes'})
GEN.selectByFilter({feat_types:'line\;arc'})
if(GEN.getSelectCount() > 0){
GEN.selCreateProfile()
GEN.selClearFeature()
}
}
}
var copper_percent_pcs = signalLayers.map(function(v){
var tmp = {layer:v}
tmp.copper_percent = GEN.copperArea({layer1:v}).percent + "%"
return tmp
})
GEN.closeStep()
copper_percent_pcs.forEach(function(item){
save_layerinfo({
jobid: JobId,
layer: item.layer,
layerinfohash: {
copper_percent: item.copper_percent
}
})
})
}
})
// 保存
if(/yes/ig.test(par.auto_save)){
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
} else {
GEN.checkInout({job:job,mode:"in"})
}
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
progress: 33.33
},
where: { id: $.task_id }
});
if (GEN.hasError()) {
Status = 'error';
resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {
status: Status,
result_data: resultData
};
} else {
resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
return {
status: Status,
result_data: resultData
};
}
}
catch (e) {
Status = 'error';
console.log("==================== ============>error");
console.log(_.toString(e));
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return {status: Status, result_data: resultData};
}
function UPLOAD_LAYER_MATRIX(props){
var job = props.job
props.jobcategory = props.jobcategory || "work"
var matrix = ANALYSIS_STACKUP({job:job, jobcategory:props.jobcategory});
var layers = Object.keys(matrix).sort(function(a,b){return matrix[a]["row"] - matrix[b]["row"]})
var tableName = "pdm_job_" + props.jobcategory + "_layer";
console.log("===========>matrix upload");
var oLayers = db.query("",function(q){
return q.selectMapMap({
table:tableName,
field: ["odb_name", "release_status"],
where:{job_id:JobId},
uniquefield: "odb_name"
})
});
db.query("",function(q){
return q.deleteRow({
table:tableName,
where:{job_id:JobId},
})
});
var fieldLst = ["name", "odb_context", "odb_type", "odb_polarity", "odb_side", "drl_start", "drl_end",
"row_num", "type", "drl_start_num", "drl_end_num", "drl_from_num", "drl_to_num", "drl_connect_to",
"odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num"
];
layers.forEach(function(layer){
var layerInfo = matrix[layer];
var tmpData = {
"job_id": JobId,
"name": layerInfo["name"]
};
tmpData["release_status"] = (oLayers&&oLayers.hasOwnProperty(layerInfo["odb_name"])) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;
for (n = 0; n < fieldLst.length; n++) {
tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];
}
db.query("",function(q){
return q.insertRow({
table:tableName,
data: tmpData
})
});
})
console.log("===========>matrix upload end");
return matrix
}
function ANALYSIS_STACKUP(props){
var job = props.job
if(!props.hasOwnProperty("jobcategory")){ props.jobcategory = 'work' }
var matrix = GEN.getMatrix({job:job})
var layer_count = GEN.getLayerCount({job:job}) // !
save_job_info({jobid:JobId,jobcategory:props.jobcategory,jobinfohash:{TL_layer_count:layer_count}});
_.values(matrix).sort(function(a,b){return a.row-b.row}).forEach(function(layer){
layer.odb_name = layer.name;
layer.name = layer.tl_name;
layer.odb_context = layer.context;
layer.odb_type = layer.layer_type;
layer.odb_polarity = layer.polarity;
layer.odb_side = layer.side;
layer.row_num = layer.tl_num;
layer.type = layer.tl_type;
layer.side = layer.enum_tl_side;
layer.input_file_name = layer.file_name;
layer.odb_row_num = layer.row;
if (layer.odb_name == 'drill'){
layer.name = 'drill';
layer.drl_start_num = 1;
layer.drl_end_num = layer_count;
layer.drl_from_num = 1;
layer.drl_to_num = layer_count;
layer.type = 'main_drill';
}
else if (/^d(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'd' + drl_star + '-' + drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
if(drl_end - drl_star == 1){
layer.type = 'laser_drill'; // 镭射
} else if( drl_star == 1 || drl_end == layer_count ){
layer.type = 'blind_drill'; // 埋孔
} else{
layer.type = 'bury_drill'; // 盲孔
}
}
else if (/\-a$/.test(layer.odb_name)){
layer.side = 'top';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else if (/\-b$/.test(layer.odb_name)){
layer.side = 'bottom';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else{
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
})
return matrix;
}
function getMatrixInfo(props){ // 获取matrix各种信息
var job = props.job
var matrix = GEN.getMatrix({job:job})
Omatrix = matrix;
var res = {
matrix: matrix, // matrix
matrixVal: [], // matrix 的 value数组
mSignal: {}, // board的signal层 {}
mSignals: [], // board的signal层 []
mDrill: {}, // board的drill层
mDrills: [], // board的drill层
mSolderMask: {}, // 防焊层
mSolderMasks: [], // 防焊层
mOuters: [], // 外层和对于的防旱
mBoardLayer: [] // board层
}
for (var key in matrix) {
var value = matrix[key]
res.matrixVal.push(value)
if(value.context == "board"){
res.mBoardLayer.push(key)
switch (value.layer_type) {
case "signal":
res.mSignal[key] = value
res.mSignals.push(value)
break;
case "drill":
res.mDrill[key] = value
res.mDrills.push(value)
break;
case "solder_mask":
res.mSolderMask[key] = value
res.mSolderMasks.push(value)
break;
}
}
}
res.matrixVal = res.matrixVal.sort(function(a,b){return Number(a.row) - Number(b.row)})
res.mSignals = res.mSignals.sort(function(a,b){return Number(a.row) - Number(b.row)})
res.mDrills = res.mDrills.sort(function(a,b){return Number(a.row) - Number(b.row)})
// 找出外层 以及外层对应的防焊层 [{signalL:"top", solderL:"smt"}]
res.mOuters = res.mSignals.reduce(function(a,b){
if(b.tl_type == "outer"){
var solderLayers = res.mSolderMasks.filter(function(v){
return v.side == b.side
})
a.push({
signalL: b.name,
solderL: solderLayers.length >0 ? solderLayers[0]["name"] : null
})
}
return a
},[])
return res
}
function selCopyLayer(props){ // 拷贝选择的到辅助层
var layer = props.layer
var job = props.job
if(GEN.isLayerExists({job:job,layer:layer})){
GEN.deleteLayer({job:job,layer:layer})
}
GEN.selCopyOther({dest:'layer_name',target_layer:layer})
}
function save_job_info(props){ // 保存料号信息
var jobid = props.jobid;
var jobinfohash = props.jobinfohash;
Object.keys(jobinfohash).forEach(function(key){
var val = jobinfohash[key];
var value = db.query("",function(q){
return q.selectValue({
table:'pdm_job_jobattr',
field:"value",
where:{job_id:jobid, attr_name: key}
})
});
console.log("jobid:"+jobid+"==========dbjobvalue:" + val)
if(/done/ig.test(value) || !value){
db.query("",function(q){
return q.insertRow({
table:'pdm_job_jobattr', // todo
data:{job_id:jobid, attr_name:key, value:val}, // todo
return_field:'job_id',
})
});
} else if (value != val) {
console.log("jobid:"+jobid+"==========update jobvalue:"+value+"->" + val)
db.query("",function(q){
return q.updateRow({
table:'pdm_job_jobattr',
where:{job_id:jobid, attr_name: key},
data:{value:val},
})
});
}
})
}
function save_layerinfo(props){ // 保存层信息
var jobid = props.jobid;
var layer = props.layer;
if(Omatrix[layer] && Omatrix[layer].tl_name){
if(!(/^drill/ig.test(Omatrix[layer].tl_name))){
layer = Omatrix[layer].tl_name
}
}
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},
})
});
}
})
}
function analysis(props){
var job = props.job || Job;
var jobId = props.jobId || JobId;
var pcs_step = props.pcs_step || false;
var array_step = props.array_step || false;
var matrix = props.matrix;
function T_m_p(props){
this.job = props.job;
this.jobInfo = {};
this.jobId = props.jobId;
if(props.pcs_step){ this.pcs_step = props.pcs_step; }
if(props.matrix){ this.matrix = props.matrix; }
if(props.array_step){ this.array_step = props.array_step; }
this.matrixInfo = getMatrixInfo({job:this.job})
this.init();
}
T_m_p.prototype.init = function(){
var init_checking = ["job", "jobId", "pcs_step", "matrix"];
var t = this;
init_checking.forEach(function(v){ if(!t[v]){t.e(v+" is undefined")} })
}
T_m_p.prototype.e = function(e){ // 处理error
console.log(e)
throw e
}
T_m_p.prototype.analysis_layer_count = function(props){ // 分析board属性的层数量 []string
var matrix = this.matrixInfo.matrixVal;
var res = matrix.filter(function(v){return v.context == "board" && props.indexOf(v.layer_type) >= 0 })
return res.length
}
T_m_p.prototype.analysis_vc_card_size = function(props){ // card短边尺寸 string
return GEN.getProfileLimits({job:this.job,step:this.pcs_step})[props].toFixed(3)
}
T_m_p.prototype.analysis_vc_array_size = function(props){ // array长边尺寸 string
if(!this.array_step){return "_error"}
return GEN.getProfileLimits({job:this.job,step:this.array_step})[props].toFixed(3)
}
T_m_p.prototype.analysis_vc_pcs_count_on_panel = function(props){ //
return "_todo"
}
T_m_p.prototype.analysis_stack_vias_number = function(props){ // via孔连续叠加的层数
var t = this;
var res;
// 找出 镭射孔
var laser_layers = []
for (var key in t.matrix) {
var val = t.matrix[key]
if(val.type == "laser_drill"){
laser_layers.push(val)
}
}
if(laser_layers.length == 0){return "_error"}
GEN.openStep({job:t.job,name:t.pcs_step})
laser_layers = laser_layers.sort(function(a,b){return Number(a.row)-Number(b.row)})
var laser_info = {}
for(var i = 0; i < laser_layers.length-1; i++){
var start_layer = laser_layers[i].name
var cover_layer = laser_layers[i+1].name
GEN.workLayer({name:start_layer,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:cover_layer,use:'filter',mode:'cover'})
var count = GEN.getSelectCount()
if(count>0){
if(!laser_info[start_layer]){
laser_info[start_layer] = {}
}
laser_info[start_layer].drill_connect_layer = cover_layer
laser_info[start_layer].drill_connect_point = count
}
}
// via孔连续叠加的层数
var via_vias_info = []
function analysis_via_number(layers){
if(layers.length < 2){return}
var startlayer = layers[0].name + "_cover"
GEN.selClearFeature()
GEN.workLayer({name:layers[0].name,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
selCopyLayer({job:t.job,layer:startlayer})
var end_index = start_cover_next(startlayer,layers,0)
via_vias_info.push(end_index+1)
analysis_via_number(layers.slice(end_index))
}
function start_cover_next(start, layers, end_index){
if(layers.length < 2){
GEN.deleteLayer({job:t.job,layer:start})
return end_index
}
layers = layers.slice(1)
GEN.workLayer({name:start,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:layers[0].name,use:'filter',mode:'cover'})
var count = GEN.getSelectCount()
if (count < 1) {
GEN.deleteLayer({job:t.job,layer:start})
return ++end_index
}
var nextstartlayer = layers[0].name + "_cover"
selCopyLayer({job:t.job,layer:nextstartlayer})
GEN.deleteLayer({job:t.job,layer:start})
return start_cover_next(nextstartlayer,layers,++end_index)
}
analysis_via_number(laser_layers.slice())
if (via_vias_info.length == 1){
res = via_vias_info[0]
}else{
res = via_vias_info.reduce(function(a,b){return a-b>0?a :b})
}
t.jobInfo.stack_vias_more = "no"
if(GEN.getLayerCount({job:t.job}) > 14 && res >= 12){
t.jobInfo.stack_vias_more = "yes"
}
t.jobInfo.laser_info = laser_info;
return res
}
T_m_p.prototype.analysis_layer_exist = function(props){ // 存在某某层? string
return this.matrixInfo.matrix.hasOwnProperty(props) ? "yes" : "no"
}
T_m_p.prototype.analysis_laser_via_on_buried_hole = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_milling_bit_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_milling_length = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_board_has_attr = function(props){ // board层中检查存在01005属性物件时
GEN.openStep({job:this.job,name:this.pcs_step})
GEN.clearLayers()
GEN.affectedLayer({affected:'yes',layer:this.matrixInfo.mBoardLayer,clear_before:'yes'});
GEN.selClearFeature()
GEN.selectByFilter({attribute:props})
var res = GEN.getSelectCount() > 0? "yes" : "no"
GEN.affectedLayer({affected:'no',mode:'all'});
GEN.selClearFeature()
GEN.closeStep()
return res
}
T_m_p.prototype.analysis_vc_src_EDGE_PLATING = function(props){ // ? 检查线路外形是否存在物件,存在则存yes
var res = "no"
var rout = this.matrixInfo.matrixVal.filter(function(v){return v.layer_type == "rout"}) // 找rout层
if(rout.length == 0){
return "error:cant find rout layer"
}
GEN.openStep({job:this.job, name:this.pcs_step})
GEN.affectedLayer({affected:'no',mode:'all'})
try {
this.matrixInfo.mSignals.forEach(function(v){ // 用线路层逐层与rout层touch 找得到说明存在
GEN.workLayer({name:v.name,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:rout[0].name,mode:"touch",use:"filter"})
if( GEN.getSelectCount()>0){
throw "yes"
}
GEN.clearLayers()
})
} catch (msg) {
res = msg
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.selClearFeature()
}
GEN.closeStep()
return res
}
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_glod_finger_area = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_solder_mask_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"
if(solder_paste_info.length == 0){
res = "none"
} else if (solder_paste_info.length == 1) {
res = /top/ig.test(solder_paste_info[0]) ? "top" : "bot"
} else {
res = "both"
}
return res
}
T_m_p.prototype.analysis_silk_screen_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"
if(solder_mask_info.length == 0){
res = "none"
} else if (solder_mask_info.length == 1) {
res = /top/ig.test(solder_mask_info[0]) ? "top" : "bot"
} else {
res = "both"
}
return res
}
T_m_p.prototype.analysis_min_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_pth_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_npth_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_min_slot_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_slot_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_slot_drl_length = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_spec_slot_drl_size = function(){ // todo
return "_todo"
}
T_m_p.prototype.analysis_max_spec_slot_drl_length = function(){ // todo
return "_todo"
}
return new T_m_p({job:job, jobId:jobId, pcs_step:pcs_step, array_step:array_step,matrix:matrix})
}
function smdAnalysis(props){
var job = props.job
var steplist = props.steplist
var layers = props.layers
var res = {}
steplist.forEach(function(step){
GEN.openStep({job:job,step:step})
layers.forEach(function(layer){
// 计算开窗 数量
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
if (!res.hasOwnProperty(layer.solderL)){
res[layer.solderL] = {}
}
if(GEN.getProfile({job:job, step:step}).match(/\n/ig).length > 1){
GEN.selectByFilter({profile:'in'})
} else {
GEN.selAllFeat()
}
res[layer.solderL].sm_opening_count = GEN.getSelectCount()
GEN.selClearFeature()
}
// 分析最小smd宽高
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({attribute:props.attr})
var selCount = GEN.getSelectCount()
if(selCount>0){
var tmp_layer = layer.signalL + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step})
GEN.workLayer({name:tmp_layer,display_number:2,clear_before:'yes'})
var symbolInfo = symbolAnalysis({symbols:symbols,filterReg:/^rect/})
if (!res.hasOwnProperty(layer.signalL)){
res[layer.signalL] = {}
}
if(symbolInfo["min_width"]){ res[layer.signalL]["min_smd_width"] = symbolInfo["min_width"] }
if(symbolInfo["min_length"]){ res[layer.signalL]["min_smd_length"] = symbolInfo["min_length"] }
// 分析最小smd间距
// 创建一个checklist并且分析
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
// 分析开窗宽高
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'})
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'cover'})
var solderL_tmp = layer.solderL + "_tmp"
selCopyLayer({job:job,layer:solderL_tmp})
GEN.selClearFeature()
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"]}
GEN.deleteLayer({job:job,layer:solderL_tmp})
}
GEN.deleteLayer({job:job,layer:tmp_layer})
}
})
GEN.closeStep()
})
return res
}
function symbolAnalysis(props){
var symbols = Object.keys(props.symbols).reduce(function(a,b){
if(props.filterReg.test(b)){
var res = /^rect(\d+\.\d+|\d+)x(\d+\.\d+|\d+)/ig.exec(b).slice(1)
var num1 = res[0], num2 = res[1]
if(num1<=num2){
a.width.push(num1)
a.length.push(num2)
} else {
a.width.push(num2)
a.length.push(num1)
}
}
return a
},{width:[],length:[]})
var min_width,min_length;
if(symbols.width.length){
min_width = symbols.width.reduce(function(a,b){return b-a > 0 ? a : b})
}
if(symbols.length.length){
min_length = symbols.length.reduce(function(a,b){return b-a > 0 ? a : b})
}
return {
min_width:min_width<min_length? min_width :min_length,
min_length:min_width<min_length? min_length :min_width
}
}
function smdPitch(props){
var job = props.job
var step = props.step
var layer = props.layer
var ck = "tmp_chk"
if(GEN.isChklistExists({job:job,step:step,chklist:ck})){
GEN.COM("chklist_delete", { chklist: ck })
}
// 创建并运行
var tmpItem = {
name: "smdPitch",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes",
pp_tests: "Spacing\\;SMD",
pp_check_missing_pads_for_drills:"Yes"
}
}
if(PAR.erf && PAR.erf != ""){
tmpItem.erf = PAR.erf
}
GEN.createChklist({ // 创建checklist
chklist: ck,
items: [tmpItem]
})
GEN.chklistShow({ chklist: ck })
GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" })
GEN.chklistRun({
chklist: ck,
nact: 1,
area: 'profile'
})
var tmp_layer1 = "mk_1_"+layer+"_pitch"
var tmp_layer2 = "ms_1_"+layer+"_pitch"
if(GEN.isLayerExists({job:job,layer:tmp_layer1})){
GEN.deleteLayer({job:job,layer:tmp_layer1})
}
if(GEN.isLayerExists({job:job,layer:tmp_layer2})){
GEN.deleteLayer({job:job,layer:tmp_layer2})
}
GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch");
GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'});
GEN.selectByFilter({attribute:[{attribute:".string",text:"smd_pitch"}]})
var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var features = GEN.getFeatures({job:job,step:step,layer:tmp_layer})
// 获取最小smd间距
var tmp = features.map(function(v){
var num = Math.sqrt((v.xe-v.xs)*(v.xe-v.xs) + (v.ye-v.ys)*(v.ye-v.ys))*1000
return num.toFixed(4)
})
var res = tmp.sort(function(a,b){return a-b})[0]
GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2})
return res
}
function createChklistAndRun(par) {
var checkLayers = par.layers
var items = par.items
GEN.createChklist({ // 创建checklist
chklist: oChecklistName,
items: items
})
GEN.chklistShow({
chklist: oChecklistName
})
GEN.affectedLayer({
affected: "yes",
layer: checkLayers,
clear_before: "yes"
})
items.forEach(function(v){
GEN.chklistRun({
chklist: oChecklistName,
nact: v.nact,
area: 'profile'
})
})
}
function analysisChkAttr(par) {
var layers = par.layers;
var hash = {};
var info = par.info;
var job = par.job;
var oChecklistName = par.oChecklistName
layers.forEach(function (v) {
hash[v] = {}
Object.keys(info).forEach(function (key) {
var val = info[key]
hash[v][key] = val.reduce(function (a, type) {
var tmp = GEN.getCheckAttr({
job: job,
step: par.step,
checklist: oChecklistName,
nact: 1,
attr: v + "_min_" + type
})
if (a === "N/A" && /\d+/.test(tmp)) {
a = tmp
}
if (/\d+/.test(a) && /\d+/.test(tmp) && Number(tmp) < Number(a)) {
a = tmp
}
return a
}, "N/A")
})
})
return hash
}
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()
var res = par.map(function(drill){
GEN.affectedLayer({affected:"yes",layer:drill.layer,clear_before:"yes",mode:"all"})
GEN.selClearFeature()
GEN.selectByFilter({feat_types:"pad",include_syms:drill.symbol})
// 拷贝到_tmp
var tmplayer = drill.layer + "_tmp"
if(GEN.isLayerExists({job:job,layer:tmplayer})){GEN.deleteLayer({job:job,step:step,layer:tmplayer})}
GEN.selCopyOther({dest:"layer_name",target_layer:tmplayer})
GEN.affectedLayer({affected:"no",mode:"all"})
GEN.selClearFeature();
[drill.start,drill.end].forEach(function(item, i){
GEN.workLayer({name:item,display_number:1,clear_before:"yes"})
// GEN.selRefFeat({
// layers: tmplayer,
// use: "filter",
// mode: "touch",
// f_types: "pad",
// pads_as:"shape",
// polarity:"positive",
// include_syms:drill.symbol,
// filter: {
// feat_types:'pad'
// }
// })
GEN.COM("sel_ref_feat",
{layers:tmplayer,use:"filter",mode:"touch",pads_as:"shape",f_types:"pad",polarity:"positive\;negative",include_syms:drill.symbol})
var res = ""
var pads = GEN.getFeatures({job:job,step:step,layer:item,options:"select"})
if(pads && pads.length) {
pads = pads.filter(function(item){
return /^r\d+/.test(item.symbol)
})
pads = pads.sort(function(a,b){
return parseInt(a.symbol) - parseInt(b.symbol)
})
res = pads[0].symbol.slice(1)
}
if ( i == 0) {
drill.drl_pad_top = res
} else if (i==1){
drill.drl_pad_bot = res
}
})
GEN.deleteLayer({job:job,step:step,layer:tmplayer})
return drill
})
return res
}
function bgaAnalysis(props){
var job = props.job
var steplist = props.steplist
var layers = props.layers;
GEN.clearLayers()
GEN.affectedLayer({affected:'yes',layer:layers.map(function(v){return v.signalL})})
GEN.selectByFilter({attribute:props.attr})
var count = GEN.getSelectCount()
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.selClearFeature()
if(count == 0 ) {
return {}
}
var res = {}
steplist.forEach(function(step){
GEN.openStep({job:job,step:step})
layers.forEach(function(layer){
// 找出bga 拷贝到辅助层
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({attribute:props.attr})
var selCount = GEN.getSelectCount()
if(selCount>0){
var tmp_layer = layer.signalL + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step})
GEN.workLayer({name:tmp_layer,display_number:2,clear_before:'yes'})
// 分析数据
var syblist = _.values(symbols).reduce(function(a,b){
if (b.pad > 0 && b.line) {
a.push({symbol:b.symbol, size:Number(b.size)})
}
return a
},[])
// 找到最小的bga分析
var min_symbols = syblist.sort(function(a,b){return a.size-b.size})[0]
var min_symbols_info = min_symbols_anal({symbols:min_symbols, job:job, step:step, layer:layer})
if (!res.hasOwnProperty(layer.signalL)){
res[layer.signalL] = {}
}
res[layer.signalL].min_bga_size = myFixed(min_symbols_info["min_bga_size"],4)
res[layer.signalL].min_bga_openging_size = myFixed(min_symbols_info["min_bga_openging_size"],4)
res[layer.signalL].min_bga_pitch = myFixed(min_symbols_info["min_bga_pitch"],4)
// 分析所有BGA
var all_bga_min_pitch_info = all_bga_min_pitch_anal({job:job, step:step, layer:tmp_layer,solderLayer:layer.solderL})
res[layer.signalL].bga_min_pitch = myFixed(all_bga_min_pitch_info["bga_min_pitch"],4)
res[layer.signalL].bga_min_pitch_pad_size = myFixed(all_bga_min_pitch_info["bga_min_pitch_pad_size"],4)
res[layer.signalL].bga_min_pitch_openging_size = myFixed(all_bga_min_pitch_info["bga_min_pitch_openging_size"],4)
GEN.deleteLayer({job:job,layer:tmp_layer})
}
})
GEN.closeStep()
})
console.log(res);
return res
}
function min_symbols_anal(props){ // 分析最 symbols
var job = props.job
var step = props.step
var layer = props.layer
var symbols = props.symbols
var res = {}
GEN.selClearFeature()
GEN.selectByFilter({include_syms:symbols.symbol})
var tmp_layer = layer.signalL + "_tmp_1"
selCopyLayer({job:job,layer:tmp_layer})
// 分析数据
// 尺寸
res.min_bga_size = symbols.size
// 开窗大小
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'})
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'cover'})
var solderL_tmp = layer.solderL + "_tmp"
selCopyLayer({job:job,layer:solderL_tmp})
GEN.selClearFeature()
GEN.workLayer({name:solderL_tmp,display_number:2,clear_before:"yes"})
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solderL_tmp,step:step})
res.min_bga_openging_size = _.values(symbols_solder).reduce(function(a,b){
if (b.pad > 0 && b.line) {
if(/^rect|^oval/.test(b.symbol)){
b.size = b.width < b.height ? b.width : b.height
}
if(b.size) {
a.push({symbol:b.symbol, size:Number(b.size)})
}
}
return a
},[]).sort(function(a,b){return a.size-b.size})[0].size
GEN.deleteLayer({job:job,layer:solderL_tmp})
}
// 间距
res.min_bga_pitch = bgaPitch({job:job,step:step,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer})
return res
}
function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的
var job = props.job
var step = props.step
var layer = props.layer
var symbols = props.symbols
var solder_layer = props.solderLayer
var res = {}
var ck = "tmp_chk"
if(GEN.isChklistExists({job:job,step:step,chklist:ck})){
GEN.COM("chklist_delete", { chklist: ck })
}
// 创建并运行
var tmpItem = {
name: "bgaPitch",
nact: 1,
action: "valor_analysis_signal",
erf: PAR.erf,
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes",
pp_tests: "Spacing",
pp_check_missing_pads_for_drills:"Yes"
}
}
if(PAR.erf){
tmpItem.erf = PAR.erf
}
GEN.createChklist({ // 创建checklist
chklist: ck,
items: [tmpItem]
})
GEN.chklistShow({ chklist: ck })
GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" })
GEN.chklistRun({
chklist: ck,
nact: 1,
area: 'profile'
})
var tmp_layer1 = "mk_1_"+layer+"_pitch"
var tmp_layer2 = "ms_1_"+layer+"_pitch"
if(GEN.isLayerExists({job:job,layer:tmp_layer1})){
GEN.deleteLayer({job:job,layer:tmp_layer1})
}
if(GEN.isLayerExists({job:job,layer:tmp_layer2})){
GEN.deleteLayer({job:job,layer:tmp_layer2})
}
GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch");
GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'});
GEN.selectByFilter({attribute:[{attribute:".string",text:"bga_pitch"}]})
var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var symbols = GEN.getLayerSymsHist({job:job,layer:tmp_layer,step:step})
// 获取最小smd间距
var min_symbol = _.values(symbols).sort(function(a,b){return Number(a.size)-Number(b.size)})[0]
res.bga_min_pitch = min_symbol.size
// 所有BGA中间距最小的PAD大小
GEN.selClearFeature()
GEN.selectByFilter({include_syms:min_symbol.symbol})
var min_pitch_layer = tmp_layer + "_min"
selCopyLayer({job:job,layer:min_pitch_layer})
GEN.workLayer({name:layer,display_number:1,clear_before:'yes'});
GEN.selClearFeature()
GEN.selRefFeat({layers:min_pitch_layer,use:'filter',mode:'touch'})
var min_pad_layer = layer + "_min_pad"
selCopyLayer({job:job,layer:min_pad_layer})
GEN.workLayer({name:min_pad_layer,display_number:1,clear_before:'yes'});
var min_pad_symbols = GEN.getLayerSymsHist({job:job,layer:min_pad_layer,step:step})
var min_pad_symbol = _.values(min_pad_symbols).sort(function(a,b){return Number(a.size)-Number(b.size)})[0]
res.bga_min_pitch_pad_size = min_pad_symbol.size
if(solder_layer){
// 最小pitch开窗大小
GEN.workLayer({name:solder_layer,display_number:1,clear_before:'yes'});
GEN.selClearFeature()
GEN.selRefFeat({layers:min_pitch_layer,use:'filter',mode:'touch'})
var solder_layer_tmp = solder_layer + "_tmp"
selCopyLayer({job:job,layer:solder_layer_tmp})
GEN.selClearFeature()
GEN.workLayer({name:solder_layer_tmp,display_number:2,clear_before:"yes"})
var symbols_solder = GEN.getLayerSymsHist({job:job,layer:solder_layer_tmp,step:step})
var symbols_solder_list = _.values(symbols_solder).filter(function(v){return /\d+/ig.test(v.size)})
if(symbols_solder_list.length){
res.bga_min_pitch_openging_size = symbols_solder_list.sort(function(a,b){return Number(a.size)-Number(b.size)})[0].size
}
GEN.deleteLayer({job:job,layer:solder_layer_tmp})
}
GEN.deleteLayer({job:job,layer:min_pad_layer})
GEN.deleteLayer({job:job,layer:min_pitch_layer})
GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2})
return res
}
function bgaPitch(props){
var job = props.job
var step = props.step
var layer = props.layer
var ck = "tmp_chk"
if(GEN.isChklistExists({job:job,step:step,chklist:ck})){
GEN.COM("chklist_delete", { chklist: ck })
}
// 创建并运行
var tmpItem = {
name: "bgaPitch",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes",
pp_tests: "Spacing",
pp_check_missing_pads_for_drills:"Yes"
}
}
if(PAR.erf) {
tmpItem.erf = PAR.erf
}
GEN.createChklist({ // 创建checklist
chklist: ck,
items: [tmpItem]
})
GEN.chklistShow({ chklist: ck })
GEN.affectedLayer({ affected: "yes", layer: layer, clear_before: "yes" })
GEN.chklistRun({
chklist: ck,
nact: 1,
area: 'profile'
})
var tmp_layer1 = "mk_1_"+layer+"_pitch"
var tmp_layer2 = "ms_1_"+layer+"_pitch"
if(GEN.isLayerExists({job:job,layer:tmp_layer1})){
GEN.deleteLayer({job:job,layer:tmp_layer1})
}
if(GEN.isLayerExists({job:job,layer:tmp_layer2})){
GEN.deleteLayer({job:job,layer:tmp_layer2})
}
GEN.COM("chklist_create_lyrs,chklist="+ck+",severity=3,suffix=pitch");
GEN.workLayer({name:tmp_layer2,display_number:1,clear_before:'yes'});
GEN.selectByFilter({attribute:[{attribute:".string",text:"bga_pitch"}]})
var tmp_layer = tmp_layer2 + "_tmp"
selCopyLayer({job:job,layer:tmp_layer})
GEN.workLayer({name:tmp_layer,display_number:1,clear_before:'yes'});
var features = GEN.getFeatures({job:job,step:step,layer:tmp_layer})
var tmp = features.map(function(v){
var num = Math.sqrt((v.xe-v.xs)*(v.xe-v.xs) + (v.ye-v.ys)*(v.ye-v.ys))*1000
return num.toFixed(4)
})
var res = tmp.sort(function(a,b){return a-b})[0]
GEN.deleteLayer({job:job,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:tmp_layer1})
GEN.deleteLayer({job:job,layer:tmp_layer2})
// 矩阵
return res
}
function hasAttr(props){ // 判断层 有没有部分属性
var job = props.job // 有没有smd和bga属性的物件
var attr = props.attr
var step = props.step
var res = false
try {
var layers = props.layers
GEN.openStep({job:job,name:step})
for (var i = 0;i <layers.length;i++){
var layer = layers[i]
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature()
GEN.selectByFilter({attribute:attr})
var count = GEN.getSelectCount()
if(count && count > 0){
throw true
}
}
GEN.clearLayers()
GEN.closeStep()
}
catch (msg) {
res = msg
GEN.clearLayers()
GEN.closeStep()
}
return res
}
function myFixed(str, num) {
if(/^[1-9][0-9]*([.][0-9]+)?$/.test(str)){
var tmp = String(str)
if(tmp.search(/\./) >= 0){
tmp = tmp.split(".")
if(tmp[1].length > num){
tmp[1] = tmp[1].substr(0, num)
return tmp.join(".")
}
return str
}
return str
} else {
return str
}
}
\ No newline at end of file
...@@ -170,6 +170,96 @@ ...@@ -170,6 +170,96 @@
"type": "ODB", "type": "ODB",
"format": "ODB" "format": "ODB"
}, },
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_2",
"format_params": function(props){
var params = props.params
if(params.art_param){
var leading = params.art_param["SUPPRESS_LEAD_ZEROES"]
var trailing = params.art_param["SUPPRESS_TRAIL_ZEROES"]
var zeroes = "none"
if(/yes/ig.test(leading)){
zeroes = "leading"
}
if(/yes/ig.test(trailing)){
zeroes = "trailing"
}
var nf1,nf2
if(params.art_param.hasOwnProperty("FORMAT")){
var tmp = params.art_param["FORMAT"].split(".")
if(/\d+/ig.test(tmp[0])){nf1 = Number(tmp[0])}
if(/\d+/ig.test(tmp[1])){nf2 = Number(tmp[1])}
}
return {
"nf1": nf1 || 3,
"nf2": nf2 || 5,
"units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
"zeroes": zeroes,
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": /METRIC|MM/ig.test(params.art_param["OUTPUT_UNITS"])? "mm" :"inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
}
}
}
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_1",
"format_params": function(props){
var params = props.params
if(params.nc_param){
var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
var zeroes = "none"
if(/yes/ig.test(leading)){
zeroes = "leading"
}
if(/yes/ig.test(trailing)){
zeroes = "trailing"
}
return {
"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
"units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
"zeroes": zeroes,
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": /METRIC|MM/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
}
}
}
},
{ {
"valid": function(props){ "valid": function(props){
var file = props.file; var file = props.file;
...@@ -337,7 +427,7 @@ ...@@ -337,7 +427,7 @@
{"orig_name" : ["\\.rou$","^rout$"], "tl_name" : "rout" }, {"orig_name" : ["\\.rou$","^rout$"], "tl_name" : "rout" },
{"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.art","^outline$"], "tl_name" : "outline" }, {"orig_name" : ["^outline"], "tl_name" : "outline" },
{"orig_name" : "top-enig", "tl_name" : "top-enig" }, {"orig_name" : "top-enig", "tl_name" : "top-enig" },
{"orig_name" : "bot-enig", "tl_name" : "bot-enig" }, {"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
{"orig_name" : "fab_page2", "tl_name" : "fab_page2" }, {"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
......
...@@ -98,9 +98,6 @@ try { ...@@ -98,9 +98,6 @@ try {
if(par.outline == "" || par.outline == undefined || par.outline == null || par.outline == "null"){ if(par.outline == "" || par.outline == undefined || par.outline == null || par.outline == "null"){
outline_symbol = "null"; outline_symbol = "null";
} else { } else {
if(!/^(([^0][0-9]+|0)\.([0-9]{1,2})$)|^([^0][0-9]+|0)$/ig.test(par.outline_width)){
throw "outline_width failed"
}
par.outline_width = parseFloat(par.outline_width) par.outline_width = parseFloat(par.outline_width)
outline_symbol = "r" + String(par.outline_width * 1000); outline_symbol = "r" + String(par.outline_width * 1000);
} }
...@@ -117,36 +114,44 @@ try { ...@@ -117,36 +114,44 @@ try {
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"}); GEN.checkInout({job:job,mode:"out"});
// 判断参考层(ref_outline)是否存在并不为空 // 判断参考层(ref_outline)是否存在并不为空
if(!GEN.isLayerExists({job:job,layer:ref_outline})){throw "ref_outline不存在"} var is_outline_exist = GEN.isLayerExists({job:job,layer:outline})
if(!GEN.isLayerExists({job:job,layer:ref_outline})){
if(!is_outline_exist){
throw "外形层不存在"
}
}
var steplist = GEN.getStepList({job:job}) var steplist = GEN.getStepList({job:job})
steplist.forEach(function(step){ if(!is_outline_exist){
if(!GEN.isLayerEmpty({job:job,step:step,layer:ref_outline})){ steplist.forEach(function(step){
// 创建新的外形层(outline) if(!GEN.isLayerEmpty({job:job,step:step,layer:ref_outline})){
GEN.openStep({job:job,name:step}) // 创建新的外形层(outline)
if(GEN.isLayerExists({job:job,layer:outline})){ GEN.openStep({job:job,name:step})
GEN.workLayer({name:outline,display_number:2,clear_before:'yes'}) GEN.createLayer({job:job,layer:outline,conext:"board",type:"rout"})
GEN.selDelete() // 将参考层copy到外形层中
}else {
GEN.createLayer({job:job,layer:outline,conext:"misc",type:"document"})
}
// 将参考层copy到外形层中
GEN.selClearFeature()
GEN.workLayer({name:ref_outline,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
GEN.selCopyOther({dest:"layer_name", target_layer:outline})
GEN.selClearFeature()
GEN.workLayer({name:outline,display_number:2,clear_before:'yes'})
if(outline_symbol != "null"){
GEN.selChangeSym({symbol: outline_symbol})
GEN.selClearFeature() GEN.selClearFeature()
GEN.workLayer({name:ref_outline,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
GEN.selCopyOther({dest:"layer_name", target_layer:outline})
GEN.closeStep()
} }
})
GEN.clearLayers() }
GEN.closeStep()
steplist.forEach(function(step){
// 修改外形层
GEN.openStep({job:job,name:step})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.selClearFeature()
GEN.workLayer({name:outline,display_number:2,clear_before:'yes'})
if(outline_symbol != "null"){
GEN.selChangeSym({symbol: outline_symbol})
} }
GEN.selCreateProfile()
GEN.clearLayers()
GEN.closeStep()
}) })
// 保存 // 保存
if(/yes/ig.test(par.auto_save)){ if(/yes/ig.test(par.auto_save)){
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号 GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
...@@ -157,7 +162,14 @@ try { ...@@ -157,7 +162,14 @@ try {
GEN.checkInout({job:job,mode:"in"}) GEN.checkInout({job:job,mode:"in"})
} }
if(/yes/ig.test(par.auto_save)){
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
} else {
GEN.checkInout({job:job,mode:"in"})
}
QDfm.updateRow({ QDfm.updateRow({
table: "pdm_aimdfm_task", table: "pdm_aimdfm_task",
......
...@@ -113,7 +113,10 @@ try { ...@@ -113,7 +113,10 @@ try {
include_syms:cutting_marign_symbol, include_syms:cutting_marign_symbol,
profile: "out" profile: "out"
}) })
GEN.selDelete() // ? if(GEN.getSelectCount()> 0){
GEN.selDelete()
}
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.closeStep() GEN.closeStep()
}) })
......
...@@ -73,14 +73,14 @@ if (!$.hasOwnProperty('auto_save')){ ...@@ -73,14 +73,14 @@ if (!$.hasOwnProperty('auto_save')){
PAR.auto_save = "no" PAR.auto_save = "no"
} }
// drill tool manage // drill tool manage
var drill_toll_manage = [] var drill_toll_manage = {}
try { try {
var par = PAR; var par = PAR;
var config = { var config = {
format: { format: {
"Gerber274x_1": { "Gerber274x_1": {
"nf1": 2, "nf1": 5,
"nf2": 5, "nf2": 5,
"units": "inch", "units": "inch",
"zeroes": "leading", "zeroes": "leading",
...@@ -98,10 +98,10 @@ try { ...@@ -98,10 +98,10 @@ try {
"merge_by_rule": "no", "merge_by_rule": "no",
"signed_coords": "no", "signed_coords": "no",
"text_line_width": 0.0024 "text_line_width": 0.0024
}, },
"Excellon2_1": { "Excellon2_1": {
"nf1": 2, "nf1": 2,
"nf2": 5, "nf2": 3,
"units": "inch", "units": "inch",
"zeroes": "none", "zeroes": "none",
"decimal": "no", "decimal": "no",
...@@ -118,7 +118,7 @@ try { ...@@ -118,7 +118,7 @@ try {
"merge_by_rule": "no", "merge_by_rule": "no",
"signed_coords": "no", "signed_coords": "no",
"text_line_width": 0.0024 "text_line_width": 0.0024
} }
}, },
odb: [{ odb: [{
vaild: function(item){ vaild: function(item){
...@@ -141,7 +141,7 @@ try { ...@@ -141,7 +141,7 @@ try {
format: "Excellon2_1" format: "Excellon2_1"
} }
] ]
} }
if(!par.hasOwnProperty("path")){throw "缺少资料路径"} if(!par.hasOwnProperty("path")){throw "缺少资料路径"}
if(_.isEmpty(Job)){throw "参数Job不存在"} if(_.isEmpty(Job)){throw "参数Job不存在"}
var job = Job.toLowerCase() var job = Job.toLowerCase()
...@@ -167,7 +167,9 @@ try { ...@@ -167,7 +167,9 @@ try {
if(/\.drl$/ig.test(file.name)){ if(/\.drl$/ig.test(file.name)){
var backUpName = file.name+".backup" var backUpName = file.name+".backup"
// 备份 // 备份
fs.copyFile(file.path,file.dir+"/"+backUpName) if(!fs.fileExists(file.dir+"/"+backUpName)){
fs.copyFile(file.path,file.dir+"/"+backUpName)
}
// 读取 // 读取
var data = fs.readFile(file.path) var data = fs.readFile(file.path)
data = data.split("\n") data = data.split("\n")
...@@ -177,6 +179,7 @@ try { ...@@ -177,6 +179,7 @@ try {
var headData = head.filter(function(v){ var headData = head.filter(function(v){
return /Holesize.+Tolerance.+PLATED/ig.test(v) return /Holesize.+Tolerance.+PLATED/ig.test(v)
}) })
headData.map(function(v){ headData.map(function(v){
var res = { var res = {
holesize: {}, holesize: {},
...@@ -195,12 +198,18 @@ try { ...@@ -195,12 +198,18 @@ try {
res.tolerance.bot = Tolerance_tmp[1].trim() res.tolerance.bot = Tolerance_tmp[1].trim()
res.attr = /NON_PLATED/ig.test(v) ? "non_plated" : "plated" res.attr = /NON_PLATED/ig.test(v) ? "non_plated" : "plated"
res.unit = /MILES/ig.test(v) ? "inch" : "mm" res.unit = /MILS/ig.test(v) ? "inch" : "mm"
res.quantity = parseInt(v.split("=").pop()) res.quantity = parseInt(v.split("=").pop())
drill_toll_manage.push(res) if(!drill_toll_manage.hasOwnProperty(file.name)){
drill_toll_manage[file.name] = {}
}
drill_toll_manage[file.name][/(\d+)/ig.exec(res.holesize.key)[1]] = res
}) })
// 给body添加刀 // 给body添加刀
var count = 0 var count = 0
body = body.filter(function(v){
return !(/T\d+/ig.test(v))
})
body.forEach(function(v, i){ body.forEach(function(v, i){
if(/^%$|^M00/ig.test(v)){ if(/^%$|^M00/ig.test(v)){
var k = "T" + getK(++count) var k = "T" + getK(++count)
...@@ -212,10 +221,31 @@ try { ...@@ -212,10 +221,31 @@ try {
fs.writeFile(file.path,resStr) fs.writeFile(file.path,resStr)
} }
}) })
drill_toll_manage.forEach(function(v){ importGerber({job:job,step:"orig",db:"genesis",data:inputInfo.data})
console.log(v); var stepList = GEN.getStepList({job:job})
}) var matrix = GEN.getMatrix({job:job})
// importGerber({job:job,step:"pcs",db:"genesis",data:inputInfo.data}) var drill_layers = Object.keys(matrix).filter(function(v){return matrix[v].layer_type=="drill"})
stepList.forEach(function(step){
GEN.openStep({job:job,name:step})
drill_layers.forEach(function(layer){
var drill_tool_manage_info = drill_toll_manage[layer]
var drill_tool_keys = Object.keys(drill_tool_manage_info).sort(function(a,b){return a-b})
GEN.COM("tools_tab_reset")
drill_tool_keys.forEach(function(key){
var val = drill_tool_manage_info[key]
GEN.COM("tools_tab_add", {
num: key,
type: /plated/ig.test(val.attr) ? "plate" : "nplate",
min_tol: Number(val.tolerance.top),
max_tol: Number(val.tolerance.bot),
finish_size: Number(val.holesize.value),
drill_size: Number(val.holesize.value)
})
})
GEN.COM("tools_set",{layer:layer,thickness:0,user_params:1,slots:"by_length"})
})
GEN.closeStep()
})
} }
// 保存 // 保存
......
...@@ -42,7 +42,7 @@ PARAMETER: ...@@ -42,7 +42,7 @@ PARAMETER:
*/ */
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
console.log("==============================>设置零点"); console.log("==============================>set origin");
// 引入模块 包 // 引入模块 包
var $ = require('topcam.scriptfunc').argv(); var $ = require('topcam.scriptfunc').argv();
var fs = require('fs'); var fs = require('fs');
...@@ -80,7 +80,7 @@ try { ...@@ -80,7 +80,7 @@ try {
par[key] = default_par[key] par[key] = default_par[key]
} }
} }
if(_.isEmpty(Job)) if(_.isEmpty(Job)){throw "Job参数未拿到"}
var job = Job.toLowerCase() var job = Job.toLowerCase()
var outline = par.outline var outline = par.outline
// 检查料号是否存在 // 检查料号是否存在
...@@ -103,19 +103,13 @@ try { ...@@ -103,19 +103,13 @@ try {
var outline_symbol = GEN.getSymbolLimits({job:job,symbol:outline}) var outline_symbol = GEN.getSymbolLimits({job:job,symbol:outline})
GEN.affectedLayer({affected:"yes",mode:"all"}) GEN.affectedLayer({affected:"yes",mode:"all"})
GEN.selMove({dx:-outline_symbol.xmin,dy:-outline_symbol.ymin}) GEN.selMove({dx:-outline_symbol.xmin,dy:-outline_symbol.ymin})
// 创建为profile
GEN.affectedLayer({affected:"no",mode:"all"}) GEN.affectedLayer({affected:"no",mode:"all"})
GEN.workLayer({name:outline,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
GEN.selCreateProfile()
GEN.clearLayers() GEN.clearLayers()
GEN.selClearFeature() GEN.selClearFeature()
GEN.closeJob() GEN.closeStep()
} }
}) })
// 保存 // 保存
if(/yes/ig.test(par.auto_save)){ if(/yes/ig.test(par.auto_save)){
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号 GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
...@@ -126,6 +120,7 @@ try { ...@@ -126,6 +120,7 @@ try {
GEN.checkInout({job:job,mode:"in"}) GEN.checkInout({job:job,mode:"in"})
} }
console.log("set origin end")
QDfm.updateRow({ QDfm.updateRow({
......
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'step',
title : 'Step',
type : 'LineEdit',
property : {tool_tip : 'orig'},
},
{
name : 'rename_rule',
title : '改名规则',
type : 'TextEdit',
property : {tool_tip : '支持正则匹配'},
setter:function(obj,value,self){
obj.setPlainText(value);
},
getter:function(obj,self){
return obj.plainText
}
},
{
name : 'sort_rule',
title : '排序规则',
type : 'TextEdit',
property : {tool_tip : '支持正则匹配'},
setter:function(obj,value,self){
obj.setPlainText(value);
},
getter:function(obj,self){
return obj.plainText
}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> input原稿 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 资料路径 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>rename and sort");
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title
},
where: {
id: $.task_id
}
});
}
var GEN = $.gen;
var fs = require("fs");
var Job = $.job_name;
var db = $.db
var Status = 'ok';
var resultData = [];
var PAR = {};
if ($.hasOwnProperty('script_parameter')) {
PAR = JSON.parse($.script_parameter);
}
try {
var par = PAR;
if(par.step == ""){par.step = "orig"}
var rename_rule, sort_rule;
try {
rename_rule = eval(par.rename_rule)
sort_rule = eval(par.sort_rule)
} catch (error) {
throw "改名排序规则出错"
}
if (_.isEmpty(Job)) { throw "参数Job不存在" }
var job = Job.toLowerCase()
// 检查料号是否存在
if(!GEN.isJobExists({job:job})){throw "料号已经:"+job+"不存在"}
// 检查料号是否被打开
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
// 检查料号是否能够check out
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
var orig_step = par.step.toLowerCase()
var stepList = GEN.getStepList({job:job})
if(stepList.indexOf(orig_step) < 0){throw "step:"+orig_step+"不存在"}
// 脚本开始
var matrix = GEN.getMatrix({job:job})
// 添加标准名
var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:rename_rule}) // 给matrix信息添加tl_name
// 排序和设属性
var ret = sortLayer({job:job, rule:sort_rule, matrix:tl_name_matrix})
if(ret.err){throw err}
var after_sort_matrix = ret.sortNames
// 设置钻孔
err = setDrill({job:job, matrix:after_sort_matrix})
if(err){throw err}
// 改名
err = reName({job:job, matrix:after_sort_matrix, cfg:sort_rule})
if(err){throw err}
// 保存
if (/yes/ig.test(par.auto_save)) {
GEN.checkInout({job: job,mode: "out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job: job,mode: "in"})
GEN.closeJob({ job: job })
} else {
GEN.checkInout({job: job,mode: "in" })
}
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
progress: 33.33
},
where: {
id: $.task_id
}
});
if (GEN.hasError()) {
Status = 'error';
resultData.push({
type: "error",
title: "GEN错误!",
detail: [{
desc: _.join(GEN.STATUS, "\n")
}]
});
return {
status: Status,
result_data: resultData
};
} else {
resultData.push({
type: "info",
title: "操作完成, 请注意检查!"
});
return {
status: Status,
result_data: resultData
};
}
} catch (e) {
Status = 'error';
resultData.push({
type: "error",
title: "脚本执行出错!",
detail: [{
desc: _.toString(e)
}]
});
return {
status: Status,
result_data: resultData
};
}
function tlNameMatrix(props){ // 设置标准名
var matrix = props.matrix
var tlname_rules = []
props.tl_name.forEach(function(item){
if(typeof item.orig_name == "string"){
tlname_rules.push(item)
} else {
item.orig_name.forEach(function(name2){
var tmp = {
orig_name: name2,
tl_name: item.tl_name,
sort: item.sort,
}
if(item.pg){
tmp.pg = 1
}
tlname_rules.push(tmp)
})
}
})
var res = Object.keys(matrix).map(function(key){ // 将matrix信息添加tl_name 如果没有tl_name 就返回原信息
var val = matrix[key]
if(val.hasOwnProperty("tl_name")){delete val.tl_name}
var tlRule = tlname_rules.filter(function(rule){
if(rule.orig_name === key){return true}
var reg = new RegExp(rule.orig_name,"ig")
return reg.test(key)
})
if(tlRule.length == 0){return val}
for(var i=0;i<tlRule.length;i++){
if(tlRule[i].orig_name === key){return _.assign(val,{tl_name:tlRule[0].tl_name})}
}
tlRule = tlRule.sort(function(a,b){return a.sort - b.sort})
var reg = new RegExp(tlRule[0].orig_name,"ig")
var tmp = reg.exec(key)
if(tmp && tmp.length){
var replaceArr = tmp.slice(1)
var tl_name = tlRule[0].tl_name
var params = {}
for(var i = 0; i<replaceArr.length;i++){
params["$"+(i+1)] = replaceArr[i]
}
replaceArr.forEach(function(v,i){
tl_name = tl_name.replace("($"+(i+1)+")",v)
})
tl_name = replaceTlName(tl_name)
function replaceTlName(name){
var tmp = /(\([^)]*\))/ig.exec(name)
if(!tmp){ return name }
var param_arr = tmp[1].match(/\$\d+/ig)
var newname = tmp[1]
param_arr.forEach(function(v){
newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
})
newname = name.replace(tmp[1],eval(newname))
return replaceTlName(newname)
}
if(tlRule[0].pg){
return _.assign(val,{tl_name:tl_name,pg:true})
}else{
return _.assign(val,{tl_name:tl_name})
}
}else {
return _.assign(val,{tl_name:tlRule[0].tl_name})
}
})
return res
}
function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则}
var job = props.job
var matrix = GEN.getMatrix({job:job})
var tl_matrix = props.matrix
var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
var matrixFirst = matrixName[0]; // 记录matrix中第一位
var sortNames = [];
var miscName = tl_matrix.filter(function(value){ // 找出需要排序的名称列表
var flag = true;
if (!value.tl_name || value.tl_name == ""){return true}
var tl_name = value.tl_name
props.rule.forEach(function(item,i){
var evalReg = "/"+item.tl_name+"/ig.test(tl_name)";
if(tl_name == item.tl_name || eval(evalReg)){
flag = false;
if(tl_name === item.tl_name){
var _item = JSON.parse(JSON.stringify(item));
_item.value = i;
_item.name = value.name
_item.rule = item.tl_name
sortNames.push(_item);
} else {
var _item = JSON.parse(JSON.stringify(item));
_item.value = i;
var str = "/"+ item.tl_name +"/ig.exec(tl_name)"
_item.value2 = eval(str).pop() - 0;
_item.name = value.name
_item.rule = item.tl_name
_item.tl_name = tl_name;
if(value.pg){_item.pg = true}
sortNames.push(_item);
}
}
});
return flag;
}).map(function(v){return v.name})
miscName.forEach(function(n){
if(matrix[n].context == 'board'){
GEN.matrixLayerAttr({job:job,layer:n,context:'misc'})
}
})
sortNames = sortNames.sort(function(a,b){
return a.value - b.value || a.value2 - b.value2
})
// 排序
if(sortNames.length){
if(sortNames[0].name !== matrixFirst) { // 如果第一位和matrix中第一位不同,先把第一位插入到最前面
GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst })
}
sortNames.forEach(function(v,i,arr){
if(i !== 0){
GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })
}
if(v.pg){
GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},{"context":"board","type":"power_ground", "polarity":"negative"}));
} else {
GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
}
})
}
return {
sortNames:sortNames
}
}
function setDrill(props){ // 设置钻孔
var job = props.job
var matrix = props.matrix
// 获取所有的钻孔层
var drillLayer = matrix.filter(function(v){
return (v.attr.type == "drill" || v.attr.type == "rout") && v.attr.context == "board"
})
// 获取所有single层
var signalLayer = matrix.filter(function(v){
return (v.attr.type == "signal" || v.attr.type == "power_ground") && v.attr.context == "board"
})
var layerCount = matrix.length
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
function findSignal(num){
return signalLayer[Number(num-1)].name
}
function doDrill(drills){ // 分析钻孔层
return drills.map(function(v){
if(v.name == "drill" || v.name=="rout" || v.name=="outline" || v.name=="drl"){
return {start:findSignal(1), end:findSignal(layerCount), layer:v.name}
} else {
var tmp = /(\d+)-(\d+)/ig.exec(v.tl_name);
if(tmp){
var start = findSignal(tmp[1]);
var end = findSignal(tmp[2]);
return {start:start, end:end, layer:v.name}
} else {
return 0;
}
}
})
}
var drillSetList = doDrill(drillLayer); // 分析得到钻孔设置结果
drillSetList = drillSetList.filter(function(v){return v!==0})
drillSetList.forEach(function(v){
GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end})
})
}
function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
var job = props.job
var matrix = props.matrix
var cfg = props.cfg
matrix = matrix.filter(function(v){return v.name != v.new_name})
var rename_list = matrix.map(function(item){
var new_name;
var tl_name = item.tl_name
var rule = item.rule
if(rule === tl_name){
new_name = item.new_name
} else {
var reg = new RegExp(rule,"ig")
var tmp = reg.exec(tl_name)
if(!tmp){return undefined}
var replaceArr = tmp.slice(1)
new_name = item.new_name
var params = {}
for(var i = 0; i<replaceArr.length;i++){
params["$"+(i+1)] = replaceArr[i]
}
replaceArr.forEach(function(v,i){
tl_name = tl_name.replace("($"+(i+1)+")",v)
})
new_name = replaceTlName(new_name)
function replaceTlName(name){
var tmp = /(\([^)]*\))/ig.exec(name)
if(!tmp){ return name }
var param_arr = tmp[1].match(/\$\d+/ig)
var newname = tmp[1]
param_arr.forEach(function(v){
newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
})
newname = name.replace(tmp[1],eval(newname))
return replaceTlName(newname)
}
}
return {
orig_name: item.name,
new_name: new_name
}
})
rename_list = rename_list.filter(function(v){
var flag = true
if(!v){flag = false}
if(!v.orig_name || !v.new_name ){flag = false}
return flag
})
rename_list.forEach(function(v){
if(v.orig_name !== v.new_name){
GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name})
}
});
// 最后 如果第一个 最后一个不是top bottom 就手动修改
var afterMatrix = GEN.getMatrix({job:job})
var signals = Object.keys(afterMatrix).filter(function(v){return afterMatrix[v].layer_type=="signal" && afterMatrix[v].context=="board"})
signals = signals.sort(function(a,b){return afterMatrix[a].row - afterMatrix[b].row})
}
\ No newline at end of file
...@@ -557,567 +557,3 @@ function set_drill_attr(props){ // 镭射孔via,无铜孔npth,其余孔pth ...@@ -557,567 +557,3 @@ function set_drill_attr(props){ // 镭射孔via,无铜孔npth,其余孔pth
GEN.selAddAttr({attribute:attr}) GEN.selAddAttr({attribute:attr})
} }
/*
NAME:
DESCRIPTION: 客户数据分析
PARAMETER:
[
{
name : 'step_filter',
title : 'Step过滤',
type : 'LineEdit',
property : {tool_tip : '过滤step信息'}
},
{
name : 'erf',
title : 'erf名称',
type : 'LineEdit',
property : {tool_tip : ''}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 客户数据分析</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 客户参数 </p>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
*/
/*
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var IKM = $.ikm;
var GEN = $.gen;
var GUI = $.gui;
var Job = $.job;
var JobId = $.job_id;
var mode = "develop" // 运行模式 develop 开发模式 方便调试
try {
var job = "1"
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
// 获得镭射层
var laser_drills = _.values(matrix).filter(function(v){return v.type == "laser_drill"})
// 获取钻孔信息上传
// 拿到array_step的信息
var array_step = "stp"
var arr_step_drill_tool_info = {}
GEN.openStep({job:job,name:array_step})
laser_drills.forEach(function(layer){
// 打散step
GEN.COM('sredit_reduce_nesting,mode=one_highest')
arr_step_drill_tool_info[layer] = GEN.getTool({job:job,step:array_step,layer:layer})
})
GEN.closeStep()
var stepList = ["cad"]
stepList.forEach(function(step){
GEN.openStep({job:job,name:step})
laser_drills.forEach(function(layer){
GEN.clearLayers()
GEN.workLayer({name:layer.name, display_number:1,clear_before:"yes"})
GEN.selClearFeature()
GEN.selAllFeat()
var count = GEN.getSelectCount()
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
// GEN.selAddAttr({attribute:'.drill',option:'laser'})
// GEN.selectByFilter({attribute:[{attribute:'.drill',option:'laser'}]})
// GEN.selReverse()
var tool_mamager = GEN.getTool({job:job,step:step,layer:layer.name})
Object.keys(tool_mamager).forEach(function(key){
var tool = tool_mamager[key];
var data = {
job_id: JobId,
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,
finish_slot_length: tool.slot_len,
size_tol_lower: tool.min_tol,
size_tol_upper: tool.max_tol,
pcs_count: tool.count,
array_count: arr_step_drill_tool_info[layer.name][key].count, // todo
attr_data: {}
// {"allowance": 2, "org_layer_name": "hhhh"}
}
IKM.crud("insertRow",{
table:'pdm_job_cam_drill',
data:data,
return_field:'id',
})
})
}
GEN.selClearFeature()
GEN.clearLayers()
})
GEN.closeStep()
})
GUI.msg("Done")
return 'Done';
}
catch (error) {
GUI.msg(error);
return 'Error';
}
function UPLOAD_LAYER_MATRIX(props){
var job = props.job
props.jobcategory = props.jobcategory || "work"
var matrix = ANALYSIS_STACKUP({job:job, jobcategory:props.jobcategory});
var func = 'function(ARGV)\
{\
var jobId = ARGV["job_id"];\
var tableName = "pdm_job_" + ARGV["jobcategory"] + "_layer";\
//GUI.msgbox({text: TDataParse.variant2JsonStr(tableName)});\
var db = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());\
db.begin();\
try{\
var oLayers = db.selectMapMap({table:tableName, field:["odb_name","release_status"], where:{job_id:jobId}, uniquefield:"odb_name"});\
if (db.lastError().isValid()) throw db.lastError();\
//GUI.msgbox({text: TDataParse.variant2JsonStr(oLayers)});\
\
db.deleteRow({table:tableName, where:{job_id:jobId}});\
if (db.lastError().isValid()) throw db.lastError();\
\
var fieldLst = ["name", "odb_context", "odb_type", "odb_polarity", "odb_side", "drl_start", "drl_end",\
"row_num", "type", "drl_start_num", "drl_end_num", "drl_from_num", "drl_to_num", "drl_connect_to", \
"odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num"];\
\
for (var i=0;i<ARGV["layers"].length;i++)\
{\
layerName = ARGV["layers"][i];\
var layerInfo = ARGV["matrix"][layerName];\
var tmpData = {"job_id":jobId, "name": layerInfo["name"]};\
if (ARGV["releasestatus"] != undefined && ARGV["releasestatus"] != null && ARGV["releasestatus"].length>0\
&& ARGV["releasestatus"][layerInfo["odb_name"]] != undefined && ARGV["releasestatus"][layerInfo["odb_name"]] != null )\
{\
tmpData["release_status"] = ARGV["releasestatus"];\
}\
else\
{\
tmpData["release_status"] = oLayers.hasOwnProperty(layerInfo["odb_name"]) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;\
}\
for (n = 0; n < fieldLst.length; n++)\
{\
tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];\
}\
//GUI.msgbox({text: TDataParse.variant2JsonStr(tmpData)});\
db.insertRow({table:tableName, data:tmpData});\
if (db.lastError().isValid()) throw db.lastError();\
}\
db.commit();\
return new TDataResponse();\
}\
catch (err)\
{\
print(err.text());\
db.rollback();\
return new TDataResponse(err, "");\
}\
}';
// var ret = IKM.command( func, // ?? =========================> tmp
// { job_id :JobId,
// matrix:matrix,
// layers: Object.keys(matrix).sort(function(a,b){return matrix[a]["row"] - matrix[b]["row"]}),
// jobcategory:props.jobcategory}, 1);
// if (ret.errText) {
// return {
// jobcategory:props.jobcategory,
// errText :ret.errText,
// errCode :ret.errCode,
// };
// }
return matrix
}
function ANALYSIS_STACKUP(props){
var job = props.job
if(!props.hasOwnProperty("jobcategory")){ props.jobcategory = 'work' }
var matrix = GEN.getMatrix({job:job})
var layer_count = IKM.get_jobinfo({jobname:JobId,jobcategory:props.jobcategory,jobinfo:'layer_count'});
if(!layer_count){
layer_count = GEN.getLayerCount({job:job})
}
IKM.save_job_info({jobid:JobId,jobcategory:props.jobcategory,jobinfohash:{TL_layer_count:layer_count}});
_.values(matrix).sort(function(a,b){return a.row-b.row}).forEach(function(layer){
layer.odb_name = layer.name;
layer.name = layer.tl_name;
layer.odb_context = layer.context;
layer.odb_type = layer.layer_type;
layer.odb_polarity = layer.polarity;
layer.odb_side = layer.side;
layer.row_num = layer.tl_num;
layer.type = layer.tl_type;
layer.side = layer.enum_tl_side;
layer.input_file_name = layer.file_name;
layer.odb_row_num = layer.row;
if (layer.odb_name == 'drill'){
layer.name = 'drill';
layer.drl_start_num = 1;
layer.drl_end_num = layer_count;
layer.drl_from_num = 1;
layer.drl_to_num = layer_count;
layer.type = 'main_drill';
}
else if (/^d_(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'drill' + drl_star + '-' + drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
if( drl_star == 1 || drl_end == layer_count ){
layer.type = 'blind_drill'; // 埋孔
}
else{
layer.type = 'bury_drill'; // 盲孔
}
}
else if (/^d(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'd'+drl_star+'-'+drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
layer.type = 'laser_drill'; // 镭射孔
}
else if (/\-a$/.test(layer.odb_name)){
layer.side = 'top';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else if (/\-b$/.test(layer.odb_name)){
layer.side = 'bottom';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else{
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
})
return matrix;
}
function tmp(){
return {
"sst": {
"row": "1","type": "solder_paste","name": "sp_fr","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -1000,"tl_name": "sp_fr","tl_type": "solder_paste","odb_name": "sst","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top",
"row_num": -1000,"odb_row_num": "1"
},
"spt": {
"row": "2","type": "solder_paste","name": "sp_fr(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -999,"tl_name": "sp_fr(2)","tl_type": "solder_paste","odb_name": "spt","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top",
"row_num": -999,"odb_row_num": "2"
},
"smt": {
"row": "3","type": "solder_mask","name": "sm_fr","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -998,"tl_name": "sm_fr","tl_type": "solder_mask","odb_name": "smt","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "top",
"row_num": -998,"odb_row_num": "3"
},
"top": {
"row": "4","type": "outer","name": "top","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1,"tl_name": "top","tl_type": "outer","odb_name": "top","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "top",
"row_num": 1,"odb_row_num": "4"
},
"isl2": {
"row": "5","type": "inner","name": "l2","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 2,"tl_name": "l2","tl_type": "inner","odb_name": "isl2","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 2,"odb_row_num": "5"
},
"isl3": {
"row": "6","type": "inner","name": "l3","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 3,"tl_name": "l3","tl_type": "inner","odb_name": "isl3","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 3,"odb_row_num": "6"
},
"isl4": {
"row": "7","type": "inner","name": "l4","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 4,"tl_name": "l4","tl_type": "inner","odb_name": "isl4","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 4,"odb_row_num": "7"
},
"isl5": {
"row": "8","type": "inner","name": "l5","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 5,"tl_name": "l5","tl_type": "inner","odb_name": "isl5","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 5,"odb_row_num": "8"
},
"isl6": {
"row": "9","type": "inner","name": "l6","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 6,"tl_name": "l6","tl_type": "inner","odb_name": "isl6","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 6,"odb_row_num": "9"
},
"isl7": {
"row": "10","type": "inner","name": "l7","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 7,"tl_name": "l7","tl_type": "inner","odb_name": "isl7","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 7,"odb_row_num": "10"
},
"isl8": {
"row": "11","type": "inner","name": "l8","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 8,"tl_name": "l8","tl_type": "inner","odb_name": "isl8","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 8,"odb_row_num": "11"
},
"isl9": {
"row": "12","type": "inner","name": "l9","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 9,"tl_name": "l9","tl_type": "inner","odb_name": "isl9","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 9,"odb_row_num": "12"
},
"bottom": {
"row": "13","type": "outer","name": "bottom","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 10,"tl_name": "bottom","tl_type": "outer","odb_name": "bottom","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "bottom",
"row_num": 10,"odb_row_num": "13"
},
"smb": {
"row": "14","type": "solder_mask","name": "sm_ba","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1013,"tl_name": "sm_ba","tl_type": "solder_mask","odb_name": "smb","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1013,"odb_row_num": "14"
},
"spb": {
"row": "15","type": "solder_paste","name": "sp_ba","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1014,"tl_name": "sp_ba","tl_type": "solder_paste","odb_name": "spb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1014,"odb_row_num": "15"
},
"ssb": {
"row": "16","type": "solder_paste","name": "sp_ba(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1015,"tl_name": "sp_ba(2)","tl_type": "solder_paste","odb_name": "ssb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1015,"odb_row_num": "16"
},
"d1-2": {
"row": "17","type": "laser_drill","name": "d1-2","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top",
"drl_end": "isl2","gdrl_start": "top","gdrl_end": "isl2","drl_start_num": "1","drl_end_num": "2","tl_name": "drill1-2","tl_type": "drill",
"tl_num": 10016,"odb_name": "d1-2","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10016,"odb_row_num": "17","drl_from_num": "1","drl_to_num": "2"
},
"d2-3": {
"row": "18","type": "laser_drill","name": "d2-3","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl2","drl_end": "isl3","gdrl_start": "isl2","gdrl_end": "isl3","drl_start_num": "2","drl_end_num": "3","tl_name": "drill2-3","tl_type": "drill",
"tl_num": 10017,"odb_name": "d2-3","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10017,"odb_row_num": "18","drl_from_num": "2","drl_to_num": "3"
},
"d3-4": {
"row": "19","type": "laser_drill","name": "d3-4","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl3","drl_end": "isl4","gdrl_start": "isl3","gdrl_end": "isl4","drl_start_num": "3","drl_end_num": "4","tl_name": "drill3-4","tl_type": "drill",
"tl_num": 10018,"odb_name": "d3-4","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10018,"odb_row_num": "19","drl_from_num": "3","drl_to_num": "4"
},
"d4-5": {
"row": "20","type": "laser_drill","name": "d4-5","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl4","drl_end": "isl5","gdrl_start": "isl4","gdrl_end": "isl5","drl_start_num": "4","drl_end_num": "5","tl_name": "drill4-5","tl_type": "drill",
"tl_num": 10019,"odb_name": "d4-5","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10019,"odb_row_num": "20","drl_from_num": "4","drl_to_num": "5"
},
"d5-6": {
"row": "21","type": "laser_drill","name": "d5-6","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl5","drl_end": "isl6","gdrl_start": "isl5","gdrl_end": "isl6","drl_start_num": "5","drl_end_num": "6","tl_name": "drill5-6","tl_type": "drill",
"tl_num": 10020,"odb_name": "d5-6","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10020,"odb_row_num": "21","drl_from_num": "5","drl_to_num": "6"
},
"d6-7": {
"row": "22","type": "laser_drill","name": "d6-7","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl6","drl_end": "isl7","gdrl_start": "isl6","gdrl_end": "isl7","drl_start_num": "6","drl_end_num": "7","tl_name": "drill6-7","tl_type": "drill",
"tl_num": 10021,"odb_name": "d6-7","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10021,"odb_row_num": "22","drl_from_num": "6","drl_to_num": "7"
},
"d7-8": {
"row": "23","type": "laser_drill","name": "d7-8","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl7","drl_end": "isl8","gdrl_start": "isl7","gdrl_end": "isl8","drl_start_num": "7","drl_end_num": "8","tl_name": "drill7-8","tl_type": "drill",
"tl_num": 10022,"odb_name": "d7-8","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10022,"odb_row_num": "23","drl_from_num": "7","drl_to_num": "8"
},
"d8-9": {
"row": "24","type": "laser_drill","name": "d8-9","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl8","drl_end": "isl9","gdrl_start": "isl8","gdrl_end": "isl9","drl_start_num": "8","drl_end_num": "9","tl_name": "drill8-9","tl_type": "drill",
"tl_num": 10023,"odb_name": "d8-9","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10023,"odb_row_num": "24","drl_from_num": "8","drl_to_num": "9"
},
"d9-10": {
"row": "25","type": "laser_drill","name": "d9-10","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl9","drl_end": "bottom","gdrl_start": "isl9","gdrl_end": "bottom","drl_start_num": "9","drl_end_num": "10","tl_name": "drill9-10","tl_type": "drill",
"tl_num": 10024,"odb_name": "d9-10","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10024,"odb_row_num": "25","drl_from_num": "9","drl_to_num": "10"
},
"drill": {
"row": "26","type": "main_drill","name": "drill","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","drl_start_num": 1,"drl_end_num": 10,"tl_name": "drill","tl_type": "drill",
"tl_num": 10025,"odb_name": "drill","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10025,"odb_row_num": "26","drl_from_num": 1,"drl_to_num": 10
},
"rout": {
"row": "27","type": "other","name": "__rout__","context": "board","layer_type": "rout","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","odb_name": "rout","odb_context": "board","odb_type": "rout","odb_polarity": "positive","odb_side": "none","odb_row_num": "27"
},
"nclegend-1-2": {
"row": "28","type": "other","name": "__nclegend-1-2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110027,"odb_name": "nclegend-1-2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110027,"odb_row_num": "28"
},
"nclegend-2-3": {
"row": "29","type": "other","name": "__nclegend-2-3__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110028,"odb_name": "nclegend-2-3","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110028,"odb_row_num": "29"
},
"nclegend-3-4": {
"row": "30","type": "other","name": "__nclegend-3-4__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110029,"odb_name": "nclegend-3-4","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110029,"odb_row_num": "30"
},
"nclegend-4-5": {
"row": "31","type": "other","name": "__nclegend-4-5__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110030,"odb_name": "nclegend-4-5","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110030,"odb_row_num": "31"
},
"nclegend-5-6": {
"row": "32","type": "other","name": "__nclegend-5-6__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110031,"odb_name": "nclegend-5-6","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110031,"odb_row_num": "32"
},
"nclegend-6-7": {
"row": "33","type": "other","name": "__nclegend-6-7__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110032,"odb_name": "nclegend-6-7","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110032,"odb_row_num": "33"
},
"nclegend-7-8": {
"row": "34","type": "other","name": "__nclegend-7-8__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110033,"odb_name": "nclegend-7-8","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110033,"odb_row_num": "34"
},
"nclegend-8-9": {
"row": "35","type": "other","name": "__nclegend-8-9__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110034,"odb_name": "nclegend-8-9","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110034,"odb_row_num": "35"
},
"nclegend-9-10": {
"row": "36","type": "other","name": "__nclegend-9-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110035,"odb_name": "nclegend-9-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110035,"odb_row_num": "36"
},
"nclegend-1-10": {
"row": "37","type": "other","name": "__nclegend-1-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110036,"odb_name": "nclegend-1-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110036,"odb_row_num": "37"
},
"outline": {
"row": "38","type": "other","name": "__outline__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110037,"odb_name": "outline","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110037,"odb_row_num": "38"
},
"top_assem": {
"row": "39","type": "other","name": "__top_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110038,"odb_name": "top_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110038,"odb_row_num": "39"
},
"bot_assem": {
"row": "40","type": "other","name": "__bot_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110039,"odb_name": "bot_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110039,"odb_row_num": "40"
},
"top_testpoint": {
"row": "41","type": "other","name": "__top_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110040,"odb_name": "top_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110040,"odb_row_num": "41"
},
"bot_testpoint": {
"row": "42","type": "other","name": "__bot_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110041,"odb_name": "bot_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110041,"odb_row_num": "42"
},
"top_osp": {
"row": "43","type": "other","name": "__top_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110042,"odb_name": "top_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110042,"odb_row_num": "43"
},
"bot_osp": {
"row": "44","type": "other","name": "__bot_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110043,"odb_name": "bot_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110043,"odb_row_num": "44"
},
"top_enig": {
"row": "45","type": "other","name": "__top_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110044,"odb_name": "top_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110044,"odb_row_num": "45"
},
"bot_enig": {
"row": "46","type": "other","name": "__bot_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110045,"odb_name": "bot_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110045,"odb_row_num": "46"
},
"fab_page2": {
"row": "47","type": "other","name": "__fab_page2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110046,"odb_name": "fab_page2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110046,"odb_row_num": "47"
},
"tmp_top_shorts": {
"row": "48","type": "other","name": "__tmp_top_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110047,"odb_name": "tmp_top_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110047,"odb_row_num": "48"
},
"tmp_bot_shorts": {
"row": "49","type": "other","name": "__tmp_bot_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110048,"odb_name": "tmp_bot_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110048,"odb_row_num": "49"
},
"bot_assy_mate": {
"row": "50","type": "other","name": "__bot_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110049,"odb_name": "bot_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110049,"odb_row_num": "50"
},
"outline+1": {
"row": "51","type": "other","name": "__outline+1__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110050,"odb_name": "outline+1","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110050,"odb_row_num": "51"
},
"top_assy_mate": {
"row": "52","type": "other","name": "__top_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110051,"odb_name": "top_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110051,"odb_row_num": "52"
}
}
}
*/
\ No newline at end of file
...@@ -148,7 +148,6 @@ try { ...@@ -148,7 +148,6 @@ try {
// }) // })
// }) // })
// }) // })
// stepList.forEach(function(step){ // stepList.forEach(function(step){
// GEN.openStep({ job: Job, step: step }) // GEN.openStep({ job: Job, step: step })
// GEN.clearLayers() // GEN.clearLayers()
......
...@@ -10,19 +10,24 @@ var Job = $.job; ...@@ -10,19 +10,24 @@ var Job = $.job;
var JobId = $.job_id; var JobId = $.job_id;
try { try {
var job = "1"
var job = "4" var step = "cad"
var matrix = GEN.getMatrix({job:job})
var tmp = [{signalL:"top",solderL:"sm_top"}, {signalL:"top",solderL:null}] IKM.msg(matrix)
// exposed return "Done"
tmp.forEach(function(item){
if(item.solderL){
IKM.msg(GEN.exposedArea({layer1:item.signalL,mask1:item.solderL}))
// {"area":"0.73817","percent":"8.986"}
}
})
return "Done"
} catch (e) { } catch (e) {
IKM.msg(e) IKM.msg(e)
return "Error" return "Error"
} }
// COM sel_cut_data,det_tol=1,con_tol=1,rad_tol=0.1,filter_overlaps=no,delete_doubles=no,use_order=yes,ignore_width=yes,ignore_holes=none,start_positive=yes,polarity_of_touching=same
// COM sel_single_feat,operation=select,x=-0.3463252953,y=0.7876788386,tol=25.4822834646,cyclic=no
// COM sel_surf2outline,width=15
function selCopyLayer(props){ // 拷贝选择的到辅助层
var layer = props.layer
var job = props.job
if(GEN.isLayerExists({job:job,layer:layer})){
GEN.deleteLayer({job:job,layer:layer})
}
GEN.selCopyOther({dest:'layer_name',target_layer:layer})
}
\ No newline at end of file
try {
var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var selector = new TSqlSelectorV2;
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('type', 'outer');
selector.setOrder("row_num", 1);
var layerList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear(); var tmp = "12.5466"
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', layerList);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear(); console.log(tmp.toFixed(2));
selector.setTable("pdm_job_work_layer");
selector.setField(["odb_name", "side"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('odb_context', 'board');
selector.setOrder("type", "solder_mask");
var nameList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var goldMap = {};
var refLayerMap = {};
_.each(nameList, function (item) {
if (item["odb_name"] == "gold") {
goldMap[item["side"]] = item["odb_name"];
} else if (item["odb_name"] == "ref_layer") {
refLayerMap[item["side"]] = item["odb_name"];
}
})
var dataMap = {};
_.each(attrList, function (valueMap) {
var tempList = [];
if (!_.isEmpty(dataMap[valueMap["layer"]])) {
tempList = dataMap[valueMap["layer"]];
}
tempList.push(valueMap);
dataMap[valueMap["layer"]] = tempList;
})
var retMap = {};
for (var key in dataMap) {
var tempMap = {};
_.each(dataMap[key], function (itemMap) {
tempMap[itemMap["attr_name"]] = itemMap["value"];
})
retMap[key] = tempMap;
}
var itemList = ["top", "bottom"];
var retList = [];
_.each(itemList, function (item) {
var tempMap = retMap[item];
tempMap["gold"] = goldMap[item];
tempMap["ref_layer"] = refLayerMap[item];
retList.push(tempMap);
})
return JSON.stringify(retList);
} catch (e) {
print(e);
GUI.msgbox({
title: 'Error',
detail: e
});
}
\ No newline at end of file
/* [{
NAME: CHILDREN :
DESCRIPTION: ; [
PARAMETER: {
[ CHILDREN :
{ [
name : 'customer', {
title : '客户配置', default_value_mode : 'customize',
type : 'LineEdit', display_style : {"validateSignal" : "anyDataChanged()",
property : {tool_tip : '客户配置'}, "initCallback" : function (obj, self) {
}, obj.setShowGrid(true);
{ obj.setDataKeyList(["item", "min_line_width", "min_line_spacing", "min_line2pad", "min_pad2pad"]);
name : 'config_path', obj.setHeaderItem([
title : '配置地址', {},
type : 'LineEdit', {
property : {tool_tip : '配置的路径'}, name: 'item',
} display: 'Item',
] dataType: "string",
displayRole: "$item"
VERSION_HISTORY: },
V1.00 2020-04-16 Scott Sun {
1.新版本 name: 'min_line_width',
display: 'Line Width',
HELP: dataType: "string",
<html><body bgcolor="#DDECFE"> size: "160",
<font size="3" color="#003DB2"><p>功能简介</p></font> displayRole: "$min_line_width"
<p> 数据标准化 </p> },
<br> {
<font size="3" color="#003DB2"><p>参数配置</p></font> name: 'min_line_spacing',
<p> 客户配置 </p> display: 'Spacing Line to Line',
<br> dataType: "string",
<font size="3" color="#003DB2"><p>注意事项</p></font> size: "160",
<p> 无 </p> displayRole: "$min_line_spacing"
<br> },
</body></html> {
*/ name: 'min_line2pad',
////////////////////////////////////////////////////////////// display: 'Spacing Line to Pad',
////////////////////////////////////////////////////////////// dataType: "string",
// 引入模块 包 size: "160",
console.log("==============================================>test2_format") displayRole: "$min_line2pad"
var $ = require('topcam.scriptfunc').argv(); },
var fs = require('fs'); {
var _ = require('lodash'); name: 'min_pad2pad',
var database = require("topsin.database"); display: 'Spacing Pad to Pad',
database.addConnection($.conf.database_conf, "DFM"); dataType: "string",
var QDfm = database.query("DFM"); displayRole: "$min_pad2pad"
if ($.conf.product_type == "aimdfm") { },
QDfm.updateRow({ ]);
table: "pdm_aimdfm_task", },
data: { "setter" : function (obj, value, self) {
current_process_title: $.process_title var loadList = [];
}, if ((value != '') && (value != undefined)) {
where: { id: $.task_id } var dataList = JSON.parse(value);
}); // for (var i = 0; i < dataList.length; i++) {
} // valueMap = dataList[i];
var GEN = $.gen; // valueMap["item"] = "L" + i;
var Job = $.job_name; // loadList.push(valueMap);
var db = $.db // }
var Status = 'ok'; obj.loadData(dataList);
var resultData = []; }
var PAR = {}; },
if ($.hasOwnProperty('script_parameter')){ "getter" : function (obj, self) {
PAR = JSON.parse($.script_parameter);
} return JSON.stringify(obj.allDataMap());
if (!$.hasOwnProperty('config_path')){ },
PAR.config_path = "cam/input_data" "property" : {"minimum_height" : 200},
} "type" : "TableView"},
try { getter_func : function () {
var mode = "use" // develop try {
var par = PAR; var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
if(!par.hasOwnProperty("customer")){throw "未填写配置"} var selector = new TSqlSelectorV2;
par.customer = par.customer[0].toUpperCase()+par.customer.slice(1).toLowerCase() selector.setTable("pdm_job_work_layer");
var cfg = db.query("",function(q){ selector.setField(["name"]);
return q.selectValue({ selector.setWhere("job_id", this.jobId);
table:'pub_conf', selector.addWhere('odb_context', 'board');
field:'text_data', selector.addWhere('odb_type', 'signal');
where:{path : par.config_path} selector.setOrder("row_num", 1);
}) var nameList = query.selectArrayValue(selector);
}); if (query.lastError().isValid()) {
throw query.lastError();
var config = eval(cfg) }
var job = Job;
if(_.isEmpty(job)) throw "没有传入料号名!"; selector.clear();
job = job.toLowerCase() selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"])
var custCfg = config.customer[par.customer] // 获取客户配置 selector.setWhere("layer", nameList);
if(!custCfg){throw "config error"} selector.addWhere("job_id", this.jobId);
var step = custCfg.step.toLowerCase() // 获取pcs_step var dataList = query.selectArrayMap(selector);
// 料号验证 if (query.lastError().isValid()) {
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" } throw query.lastError();
if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})} }
if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode != "develop"){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"}); var dataMap = {};
_.each(dataList, function (valueMap) {
// if(config.hasOwnProperty("merge_drill")){ // todo var tempList = [];
// mergeDrill({job:job}) if (!_.isEmpty(dataMap[valueMap["layer"]])) {
// } tempList = dataMap[valueMap["layer"]];
// start martix_tl_name }
var matrix = GEN.getMatrix({job:job})
var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name}) // 给matrix信息添加tl_name tempList.push(valueMap);
dataMap[valueMap["layer"]] = tempList;
var format_cfg = config.data_format // 拿到数据标准化配置 })
// 排序和设属性 var retMap = {};
var ret = sortLayer({job:job, rule:format_cfg, matrix:tl_name_matrix}) for (var key in dataMap) {
if(ret.err){throw err} var tempMap = {};
var after_sort_matrix = ret.sortNames _.each(dataMap[key], function (itemMap) {
// 设置钻孔 tempMap[itemMap["attr_name"]] = itemMap["value"];
err = setDrill({job:job, matrix:after_sort_matrix}) })
if(err){throw err} retMap[key] = tempMap;
}
// 改名
err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg}) var retList = [];
if(err){throw err} for (var key in retMap) {
// end var tempMap = retMap[key];
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号 tempMap["item"] = key;
GEN.saveJob({ job: job }); retList.push(tempMap);
GEN.checkInout({job:job,mode:"in"}) }
GEN.closeJob({job:job})
var disqualificationList = [];
QDfm.updateRow({ var layerList = [];
table: "pdm_aimdfm_task", var laserList = [];
data: { var retMap = {};
progress: 33.33 var remarkList = [];
}, _.each(retList, function (valueMap) {
where: { id: $.task_id } var num = "";
}); if (valueMap["item"] == "top") {
if (GEN.hasError()) { num = "Front";
Status = 'error'; } else if (valueMap["item"] == "bottom") {
resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] }); num = "Back";
return { } else {
status: Status, num = "L" + valueMap["item"].replace(/[^0-9]/ig, "")
result_data: resultData }
}; if (_.toNumber(valueMap["min_line_spacing"]) < 60) {
} else { disqualificationList.push(num);
resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); } else if (_.toNumber(valueMap["min_line2pad"]) < 60) {
return { disqualificationList.push(num);
status: Status, } else if (_.toNumber(valueMap["min_pad2pad"]) < 60) {
result_data: resultData disqualificationList.push(num);
}; }
}
} if (_.toNumber(valueMap["min_line_width"]) < 60) {
catch (e) { layerList.push(num);
Status = 'error'; }
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]}); if (_.toNumber(valueMap["min_ar"]) < 60) {
return {status: Status, result_data: resultData}; laserList.push(num);
} }
})
function tlNameMatrix(props){ // 设置标准名
var matrix = props.matrix retMap["remark"] = disqualificationList.join(",");
var tlname_rules = [] remarkList.push(retMap);
props.tl_name.forEach(function(item){ retMap = {};
if(typeof item.orig_name == "string"){ retMap["remark"] = layerList.join(",");
tlname_rules.push(item) remarkList.push(retMap);
} else { retMap = {};
item.orig_name.forEach(function(name2){ retMap["remark"] = laserList.join(",");
tlname_rules.push({ remarkList.push(retMap);
orig_name: name2,
tl_name: item.tl_name this.model.setWorkValues({ 'remark_tableview': JSON.stringify(remarkList) });
}) return JSON.stringify(retList);
}) }
} catch (e) {
}) print(e);
var res = Object.keys(matrix).map(function(key){ // 将matrix信息添加tl_name 如果没有tl_name 就返回原信息 GUI.msgbox({
var val = matrix[key] title: 'Error',
if(val.hasOwnProperty("tl_name")){delete val.tl_name} detail: e
var tlRule = tlname_rules.filter(function(rule){ });
if(rule.orig_name === key){return true} }
var reg = new RegExp(rule.orig_name,"ig") },
return reg.test(key) interface : '',
}) layer_list : '',
if(tlRule.length == 0){return val} merge_func : '',
for(var i=0;i<tlRule.length;i++){ merge_mode : '',
if(tlRule[i].orig_name === key){return _.assign(val,{tl_name:tlRule[0].tl_name})} merge_param : '',
} name : 'min_dim_tableview',
var reg = new RegExp(tlRule[0].orig_name,"ig") save_value_func : '',
var tmp = reg.exec(key) set_value_condition : 'default',
if(tmp && tmp.length){ set_value_func_pars : '',
var replaceArr = tmp.slice(1) set_value_mode : '',
var tl_name = tlRule[0].tl_name setter_func : '',
var params = {} state : '',
for(var i = 0; i<replaceArr.length;i++){ title : '',
params["$"+(i+1)] = replaceArr[i] title_i18n : {},
} tooltip : '',
replaceArr.forEach(function(v,i){ type : 'customize',
tl_name = tl_name.replace("($"+(i+1)+")",v) validate : '',
}) }
tl_name = replaceTlName(tl_name) ],
function replaceTlName(name){ default_value_mode : 'Spec',
var tmp = /(\([^)]*\))/ig.exec(name) display_style : {"property" : {"minimum_heigh" : 600}},
if(!tmp){ return name } getter_func : '',
var param_arr = tmp[1].match(/\$\d+/ig) interface : '',
var newname = tmp[1] layer_list : '',
param_arr.forEach(function(v){ merge_func : '',
newname = newname.replace(new RegExp("\\"+v,"ig"), params[v]) merge_mode : '',
}) merge_param : '',
newname = name.replace(tmp[1],eval(newname)) name : 'min_dim',
return replaceTlName(newname) save_value_func : '',
} set_value_condition : '',
return _.assign(val,{tl_name:tl_name}) set_value_func_pars : '',
}else { set_value_mode : '',
return _.assign(val,{tl_name:tlRule[0].tl_name}) setter_func : '',
} state : '',
}) title : 'Min.Dim(μm)',
return res title_i18n : {},
} tooltip : '',
type : 'category',
function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则} validate : '',
var job = props.job }
var matrix = GEN.getMatrix({job:job}) ,
var tl_matrix = props.matrix {
var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row}) CHILDREN :
var matrixFirst = matrixName[0]; // 记录matrix中第一位 [
var sortNames = []; {
var miscName = tl_matrix.filter(function(value){ // 找出需要排序的名称列表 default_value_mode : 'customize',
var flag = true; display_style : {"validateSignal" : "anyDataChanged()",
if (!value.tl_name || value.tl_name == ""){return true} "initCallback" : function (obj, self) {
var tl_name = value.tl_name obj.setShowGrid(true);
props.rule.forEach(function(item,i){ obj.setDataKeyList(["item", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9", "l10", "l11", "l12", "l13", "l14", "l15", "l16", "l17", "l18", "l19", "l20", "drill_connect_layer", "drill_connect_point"]);
var evalReg = "/"+item.tl_name+"/ig.test(tl_name)"; obj.setHeaderItem([
if(tl_name == item.tl_name || eval(evalReg)){ {},
flag = false; {
if(tl_name === item.tl_name){ name: 'item',
var _item = JSON.parse(JSON.stringify(item)); display: 'Item',
_item.value = i; dataType: "string",
_item.name = value.name displayRole: "$item",
_item.rule = item.tl_name size: "120"
sortNames.push(_item); },
} else { {
var _item = JSON.parse(JSON.stringify(item)); name: 'l1',
_item.value = i; display: 'L1',
var str = "/"+ item.tl_name +"/ig.exec(tl_name)" dataType: "string",
_item.value2 = eval(str).pop() - 0; size: "80",
_item.name = value.name displayRole: "$l1"
_item.rule = item.tl_name },
_item.tl_name = tl_name; {
sortNames.push(_item); name: 'l2',
} display: 'L2',
} dataType: "string",
}); size: "80",
return flag; displayRole: "$l2"
}).map(function(v){return v.name}) },
miscName.forEach(function(n){ {
if(matrix[n].context == 'board'){ name: 'l3',
GEN.matrixLayerAttr({job:job,layer:n,context:'misc'}) display: 'L3',
} dataType: "string",
}) size: "80",
sortNames = sortNames.sort(function(a,b){ displayRole: "$l3"
return a.value - b.value || a.value2 - b.value2 },
}) {
// 排序 name: 'l4',
if(sortNames.length){ display: 'L4',
if(sortNames[0].name !== matrixFirst) { // 如果第一位和matrix中第一位不同,先把第一位插入到最前面 dataType: "string",
GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst }) size: "80",
} displayRole: "$l4"
sortNames.forEach(function(v,i,arr){ },
if(i !== 0){ {
GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name }) name: 'l5',
} display: 'L5',
GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr)); dataType: "string",
}) size: "80",
} displayRole: "$l5"
return { },
sortNames:sortNames {
} name: 'l6',
} display: 'L6',
dataType: "string",
function setDrill(props){ // 设置钻孔 size: "80",
var job = props.job displayRole: "$l6"
var matrix = props.matrix },
{
// 获取所有的钻孔层 name: 'l7',
var drillLayer =matrix.filter(function(v){ display: 'L7',
return (v.attr.type == "drill" || v.attr.type == "rout") && v.attr.context == "board" dataType: "string",
}) size: "80",
// 获取所有single层 displayRole: "$l7"
var signalLayer =matrix.filter(function(v){ },
return v.attr.type == "signal" && v.attr.context == "board" {
}) name: 'l8',
var layerCount = GEN.getLayerCount({job:job}) display: 'L8',
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2 dataType: "string",
function findSignal(num){ size: "80",
return signalLayer[Number(num-1)].name displayRole: "$l8"
} },
function doDrill(drills){ // 分析钻孔层 {
return drills.map(function(v){ name: 'l9',
if(v.name == "drill" || v.name=="rout"){ display: 'L9',
return {start:findSignal(1), end:findSignal(layerCount), layer:v.name} dataType: "string",
} else { size: "80",
var tmp = /(\d+)-(\d+)/ig.exec(v.tl_name); displayRole: "$l9"
if(tmp){ },
var start = findSignal(tmp[1]); {
var end = findSignal(tmp[2]); name: 'l10',
return {start:start, end:end, layer:v.name} display: 'L10',
} else { dataType: "string",
return 0; size: "80",
} displayRole: "$l10"
} },
}) {
} name: 'l11',
var drillSetList = doDrill(drillLayer); // 分析得到钻孔设置结果 display: 'L11',
drillSetList = drillSetList.filter(function(v){return v!==0}) dataType: "string",
drillSetList.forEach(function(v){ size: "80",
GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end}) displayRole: "$l11"
}) },
} {
name: 'l12',
function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则} display: 'L12',
var job = props.job dataType: "string",
var matrix = props.matrix size: "80",
var cfg = props.cfg displayRole: "$l12"
matrix = matrix.filter(function(v){return v.name != v.new_name}) },
var rename_list = matrix.map(function(item){ {
var new_name; name: 'l13',
var tl_name = item.tl_name display: 'L13',
var rule = item.rule dataType: "string",
if(rule === tl_name){ size: "80",
new_name = item.new_name displayRole: "$l13"
} else { },
var reg = new RegExp(rule,"ig") {
var tmp = reg.exec(tl_name) name: 'l14',
if(!tmp){return undefined} display: 'L14',
var replaceArr = tmp.slice(1) dataType: "string",
new_name = item.new_name size: "80",
var params = {} displayRole: "$l14"
for(var i = 0; i<replaceArr.length;i++){ },
params["$"+(i+1)] = replaceArr[i] {
} name: 'l15',
replaceArr.forEach(function(v,i){ display: 'L15',
tl_name = tl_name.replace("($"+(i+1)+")",v) dataType: "string",
}) size: "80",
new_name = replaceTlName(new_name) displayRole: "$l15"
function replaceTlName(name){ },
var tmp = /(\([^)]*\))/ig.exec(name) {
if(!tmp){ return name } name: 'l16',
var param_arr = tmp[1].match(/\$\d+/ig) display: 'L16',
var newname = tmp[1] dataType: "string",
param_arr.forEach(function(v){ size: "80",
newname = newname.replace(new RegExp("\\"+v,"ig"), params[v]) displayRole: "$l16"
}) },
newname = name.replace(tmp[1],eval(newname)) {
return replaceTlName(newname) name: 'l17',
} display: 'L17',
} dataType: "string",
return { size: "80",
orig_name: item.name, displayRole: "$l17"
new_name: new_name },
} {
}) name: 'l18',
rename_list = rename_list.filter(function(v){ display: 'L18',
var flag = true dataType: "string",
if(!v){flag = false} size: "80",
if(!v.orig_name || !v.new_name ){flag = false} displayRole: "$l18"
return flag },
}) {
rename_list.forEach(function(v){ name: 'l19',
if(v.orig_name !== v.new_name){ display: 'L19',
GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name}) dataType: "string",
} size: "80",
}); displayRole: "$l19"
} },
{
function mergeDrill(props){ // 合并钻孔 name: 'l20',
var newdrills = [] display: 'L20',
var job = props.job; dataType: "string",
var step = GEN.getStepList({job:job})[0]; size: "80",
var maxDrill = {name:"",value:0}; displayRole: "$l20"
function getDrl(str){ },
var num = /(\d+)-(\d+)\.drl/ig.exec(str); // 匹配出 num-num {
var tmp = []; name: 'drill_connect_layer',
for(var i = Number(num[1]);i<num[2];i++){ display: 'Connect Layer',
if(i == 1){ dataType: "string",
maxDrill = Number(num[2]) > maxDrill.value? {name:str,value:Number(num[2])} : maxDrill; displayRole: "$drill_connect_layer",
} size: "120"
tmp.push("L"+i+"-"+(i+1)); },
} {
return tmp; name: 'drill_connect_point',
} display: 'Connect Point',
var matrix = GEN.getMatrix({job:job}); dataType: "string",
GEN.openStep({job : job,name:step}); displayRole: "$drill_connect_point",
for(var key in matrix){ size: "120"
var val = matrix[key]; }
if(val.layer_type == "drill" && /(\d+)-(\d+)\.drl/ig.test(val.name)){ ]);
var mergeTo = getDrl(val.name) // 要合并到的地方 },
mergeTo.forEach(function(layerName){ "setter" : function (obj, value, self) {
if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){ if ((value != '') && (value != undefined)) {
GEN.deleteLayer({job:job, layer:layerName.toLowerCase()}) var dataList = JSON.parse(value);
}
if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){ obj.loadData(dataList);
GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type}); }
newdrills.push(layerName.toLowerCase()) },
} "getter" : function (obj, self) {
GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'}); return JSON.stringify(obj.allDataMap());
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()}); },
}) "property" : {"minimum_height" : 200},
} "type" : "TableView"},
} getter_func : function () {
GEN.createLayer({job:job,layer:"b1-"+maxDrill.value,conext:'board',type:'drill'}); var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
GEN.workLayer({name:"b1-"+maxDrill.value,display_number:1,clear_before:'yes'}); var selector = new TSqlSelectorV2;
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"b1-"+maxDrill.value}); selector.setTable("pdm_job_work_layer");
GEN.affectedLayer({affected:"no",mode:"all"}); selector.setField(["name", "drl_start_num", "drl_end_num"]);
GEN.clearLayers(); selector.setWhere("job_id", this.jobId);
GEN.closeStep(); selector.addWhere('odb_context', 'board');
} selector.addWhere('odb_type', 'drill');
selector.setOrder("row_num", 1);
var drillList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('odb_context', 'board');
selector.addWhere('odb_type', 'signal');
selector.setOrder("row_num", 1);
var signalList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', signalList);
var layerCopList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var retList = [];
var tempMap = {};
_.each(layerCopList, function (itemMap) {
if (itemMap["attr_name"] == "copper_percent") {
if (itemMap["layer"] == "top") {
tempMap["l1"] = itemMap["value"];
} else if (itemMap["layer"] == "bottom") {
tempMap["l" + signalList.length] = itemMap["value"];
} else {
var num = itemMap["layer"].replace(/[^0-9]/ig, "");
tempMap["l" + num] = itemMap["value"];
}
}
tempMap["item"] = "Card Copper";
// if(itemMap["layer"] == key && itemMap["attr_name"] == "copper_percent"){
// tempMap["copper_percent"] = itemMap["value"];
// }
})
retList.push(tempMap);
var layerNumMap = {};
_.each(drillList, function (valueMap) {
var drlStartNum = valueMap["drl_start_num"];
var drlEndNum = valueMap["drl_end_num"];
var layerNumList = [];
var length = _.toNumber(drlEndNum) - _.toNumber(drlStartNum);
for (var i = 0; i <= length; i++) {
var layerNum = _.toNumber(drlStartNum) + i;
layerNumList.push(layerNum);
}
layerNumMap[valueMap["name"]] = layerNumList;
})
for (var key in layerNumMap) {
var layerNumList = layerNumMap[key];
selector.clear();
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('odb_context', 'board');
selector.addWhere('odb_type', 'signal');
selector.addWhere('row_num', layerNumList);
selector.setOrder("row_num", 1);
var layerList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', key);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var dataMap = {};
_.each(attrList, function (valueMap) {
var tempList = [];
if (!_.isEmpty(dataMap[valueMap["layer"]])) {
tempList = dataMap[valueMap["layer"]];
}
tempList.push(valueMap);
dataMap[valueMap["layer"]] = tempList;
})
var retMap = {};
for (var key in dataMap) {
var tempMap = {};
_.each(dataMap[key], function (itemMap) {
_.each(layerList, function (layerName) {
if (itemMap["attr_name"] == ("drl_pad_" + layerName)) {
tempMap[layerName] = itemMap["value"];
} else if (itemMap["attr_name"] == "drill_connect_layer"
|| itemMap["attr_name"] == "drill_connect_point") {
tempMap[itemMap["attr_name"]] = itemMap["value"];
}
})
})
retMap[key] = tempMap;
}
for (var key in retMap) {
var tempMap = retMap[key];
for (var str in tempMap) {
if (str == "top") {
tempMap["l1"] = tempMap["top"];
delete tempMap["top"];
} else if (str == "bottom") {
tempMap["l" + layerList.length] = tempMap["bottom"];
delete tempMap["bottom"];
} else if (str == "drill_connect_point" || str == "drill_connect_layer") {
continue;
}
else {
var num = str.replace(/[^0-9]/ig, "");
tempMap["l" + num] = tempMap[str];
}
}
tempMap["item"] = key;
retList.push(tempMap);
}
}
return JSON.stringify(retList);
},
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'qec_tableview',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'qec',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Via-Pad Diameter (mils) at Laser/Core-Technical & Copper Distribution',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
,
{
CHILDREN :
[
{
CHILDREN :
[
{
default_value_mode : 'customize',
display_style : {"validateSignal" : "anyDataChanged()",
"initCallback" : function (obj, self) {
obj.setShowGrid(true);
obj.setDataKeyList(["item", "smallest_pad", "smallest_pitch"]);
obj.setHeaderItem([
{},
{
name: 'item',
display: 'Item',
dataType: "string",
displayRole: "$item",
size: "180"
},
{
name: 'smallest_pad',
display: 'Smallest Pad',
dataType: "string",
size: "260",
displayRole: "$smallest_pad"
},
{
name: 'smallest_pitch',
display: 'Smallest Pitch',
dataType: "string",
displayRole: "$smallest_pitch"
},
]);
},
"setter" : function (obj, value, self) {
var itemList = ["BGA Grid(c2c)", "Ball Dia", "Number of Balls", "SM Opening Dia"];
var loadList = [];
if ((value != '') && (value != undefined)) {
var dataList = JSON.parse(value);
for (var i = 0; i < dataList.length; i++) {
var valueMap = dataList[i];
valueMap["item"] = itemList[i];
loadList.push(valueMap);
}
obj.loadData(loadList);
}
// else {
// for (var i = 0; i < itemList.length; i++) {
// var valueMap = {};
// valueMap["item"] = itemList[i];
// loadList.push(valueMap);
// }
// obj.loadData(loadList);
// }
},
"getter" : function (obj, self) {
return JSON.stringify(obj.allDataMap());
},
"property" : {"minimum_height" : 200},
"type" : "TableView"},
getter_func : function () {
var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var selector = new TSqlSelectorV2;
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('type', 'outer');
selector.setOrder("row_num", 1);
var layerList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', layerList);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var dataMap = {};
_.each(attrList, function (valueMap) {
var tempList = [];
if (!_.isEmpty(dataMap[valueMap["attr_name"]])) {
tempList = dataMap[valueMap["attr_name"]];
}
tempList.push(valueMap);
dataMap[valueMap["attr_name"]] = tempList;
})
var itemPadList = ["min_bga_pitch", "min_bga_size", "min_bga_num_of_bolls", "min_bga_openging_size"];
var itemPitchList = ["bga_min_pitch", "bga_min_pitch_pad_size", "bga_min_pitch_num_of_bolls", "bga_min_pitch_openging_size"];
var retList = [];
for (var i = 0; i < itemPadList.length; i++) {
var itemPad = itemPadList[i];
var itemPitch = itemPitchList[i];
var retPadMap = {};
var retPitchMap = {};
var tempPadList = dataMap[itemPad];
var tempPitchList = dataMap[itemPitch];
_.each(tempPadList, function (itemMap) {
retPadMap[itemMap["layer"]] = itemMap["value"];
})
_.each(tempPitchList, function (itemMap) {
retPitchMap[itemMap["layer"]] = itemMap["value"];
})
var retMap = {};
var minPad = retPadMap["top"];
for (var key in retPadMap) {
if (minPad > retPadMap[key]) {
minPad = retPadMap[key];
}
}
var minPitch = retPitchMap["top"];
for (var key in retPitchMap) {
if (minPitch > retPitchMap[key]) {
minPitch = retPitchMap[key];
}
}
retMap["smallest_pad"] = minPad;
retMap["smallest_pitch"] = minPitch;
retList.push(retMap);
}
return JSON.stringify(retList);
},
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'bga_tableview',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'bga',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'BGA(mils)',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
,
{
CHILDREN :
[
{
default_value_mode : 'customize',
display_style : {"validateSignal" : "anyDataChanged()",
"initCallback" : function (obj, self) {
obj.setShowGrid(true);
obj.setDataKeyList(["item", "top", "bottom"]);
obj.setHeaderItem([
{},
{
name: 'item',
display: 'Item',
dataType: "string",
displayRole: "$item",
size: "200"
},
{
name: 'top',
display: 'Front',
dataType: "string",
size: "240",
displayRole: "$top"
},
{
name: 'bottom',
display: 'Back',
dataType: "string",
displayRole: "$bottom"
},
]);
},
"setter" : function (obj, value, self) {
var itemList = ["Min.SMD Width", "Length", "SMD-Grid(c2c)", "SM Opening Width", "SM Opening Length", "SM Opening Points", "Test PIN Count"];
var loadList = [];
if ((value != '') && (value != undefined)) {
var dataList = JSON.parse(value);
for (var i = 0; i < dataList.length; i++) {
var valueMap = dataList[i];
valueMap["item"] = itemList[i];
loadList.push(valueMap);
}
obj.loadData(loadList);
} else {
for (var i = 0; i < itemList.length; i++) {
var valueMap = {};
valueMap["item"] = itemList[i];
loadList.push(valueMap);
}
obj.loadData(loadList);
}
},
"getter" : function (obj, self) {
return JSON.stringify(obj.allDataMap());
},
"property" : {"minimum_height" : 200},
"type" : "TableView"},
getter_func : function () {
var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var selector = new TSqlSelectorV2;
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('type', 'outer');
selector.setOrder("row_num", 1);
var layerList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', layerList);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var dataMap = {};
_.each(attrList, function (valueMap) {
var tempList = [];
if (!_.isEmpty(dataMap[valueMap["attr_name"]])) {
tempList = dataMap[valueMap["attr_name"]];
}
tempList.push(valueMap);
dataMap[valueMap["attr_name"]] = tempList;
})
var itemList = ["min_smd_width", "min_smd_length", "min_smd_pitch", "min_smd_opening_width", "min_smd_opening_length", "sm_opening_count"];
var retList = [];
_.each(itemList, function (item) {
var retMap = {};
var tempList = dataMap[item];
_.each(tempList, function (itemMap) {
retMap[itemMap["layer"]] = itemMap["value"];
})
retList.push(retMap);
})
var tempMap = {};
_.each(dataMap["sm_opening_count"], function (item) {
tempMap[item["layer"]] = _.toNumber(item["value"]) * 0.85;
})
retList.push(tempMap);
return JSON.stringify(retList);
},
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'smd_tableview',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'smd',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'SMD(mils)',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
],
default_value_mode : '',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'hlayout',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'layout',
title_i18n : {},
tooltip : '',
type : 'layout',
validate : '',
}
,
{
CHILDREN :
[
{
CHILDREN :
[
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'ATS_surface_area_base_on',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Org Surface Area Based On',
title_i18n : '',
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'carbon_Area_front',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Carbon Area Front (d㎡)',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'carbon_Area_back',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Carbon Area Back(d㎡)',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
],
default_value_mode : '',
display_style : {"type" : "FormGridLayout",
"property" : {"columns" : 3}},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'surface_area_layout1',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'layout',
title_i18n : {},
tooltip : '',
type : 'layout',
validate : '',
}
,
{
default_value_mode : 'customize',
display_style : {"validateSignal" : "anyDataChanged()",
"pack" : {"layout_type" : 2},
"initCallback" : function (obj, self) {
obj.setShowGrid(true);
obj.setDataKeyList(["item", "exposed_area", "gold", "full_type", "ref_layer", "ref_type"]);
obj.setHeaderItem([
{},
{
name: 'item',
display: 'Item',
dataType: "string",
displayRole: "$item"
},
{
name: 'exposed_area',
display: 'Exposed',
dataType: "string",
displayRole: "$exposed_area"
},
{
name: 'gold',
display: 'Gold',
dataType: "string",
displayRole: "$gold"
},
{
name: 'full_type',
display: 'Full Type',
dataType: "string",
displayRole: "$full_type"
},
{
name: 'ref_layer',
display: 'Ref.Layer',
dataType: "string",
displayRole: "$ref_layer"
},
{
name: 'ref_type',
display: 'Ref.Type',
dataType: "string",
displayRole: "$ref_type"
}
]);
},
"setter" : function (obj, value, self) {
var itemList = ["Front", "Back", "Total"];
var loadList = [];
if ((value != '') && (value != undefined)) {
var dataList = JSON.parse(value);
var tempMap = {};
var exposedArea = 0;
for (var i = 0; i < dataList.length; i++) {
var valueMap = dataList[i];
valueMap["item"] = itemList[i];
exposedArea = exposedArea + _.toNumber(valueMap["exposed_area"]);
loadList.push(valueMap);
}
tempMap["item"] = "Total";
tempMap["exposed_area"] = exposedArea;
loadList.push(tempMap);
obj.loadData(loadList);
}
},
"getter" : function (obj, self) {
return JSON.stringify(obj.allDataMap());
},
"property" : {"minimum_height" : 200},
"type" : "TableView"},
getter_func : function () {
try {
var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var selector = new TSqlSelectorV2;
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('type', 'outer');
selector.setOrder("row_num", 1);
var layerList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', layerList);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_work_layer");
selector.setField(["odb_name", "side"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('odb_context', 'board');
selector.setOrder("type", "solder_mask");
var nameList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var goldMap = {};
var refLayerMap = {};
_.each(nameList, function (item) {
if (item["odb_name"] == "gold") {
goldMap[item["side"]] = item["odb_name"];
} else if (item["odb_name"] == "ref_layer") {
refLayerMap[item["side"]] = item["odb_name"];
}
})
var dataMap = {};
_.each(attrList, function (valueMap) {
var tempList = [];
if (!_.isEmpty(dataMap[valueMap["layer"]])) {
tempList = dataMap[valueMap["layer"]];
}
tempList.push(valueMap);
dataMap[valueMap["layer"]] = tempList;
})
var retMap = {};
for (var key in dataMap) {
var tempMap = {};
_.each(dataMap[key], function (itemMap) {
tempMap[itemMap["attr_name"]] = itemMap["value"];
})
retMap[key] = tempMap;
}
var itemList = ["top", "bottom"];
var retList = [];
_.each(itemList, function (item) {
var tempMap = retMap[item];
tempMap["gold"] = goldMap[item];
tempMap["ref_layer"] = refLayerMap[item];
retList.push(tempMap);
})
return JSON.stringify(retList);
}
catch (e) {
print(e);
GUI.msgbox({
title: 'Error',
detail: e
});
}
},
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'carbon_area_tableview',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'surface_area',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Surface Area(sqdm)',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
,
{
CHILDREN :
[
{
CHILDREN :
[
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'layer_count',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Board layer',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_pcs_count_on_panel',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Single cards per panel',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : {"pack" : {"column_span" : 2}},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'structure',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Structure',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_card_size_l',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Card Size L',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_card_size_w',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Card Size W',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_array_size_l',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Array Size L',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_array_size_w',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Array Size W',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'depth_drilling',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Depth drilling',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'depth_routing',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Depth routing',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'milling_bit_size',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Milling bit size',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'milling_length',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Milling length',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'solder_mask_side',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'SM',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'silk_screen_side',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'ID',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'laser_via_on_buried_hole',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Laser Via on Buried hole',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_src_01005_pad_result',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '01005 Pad',
title_i18n : '',
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'vc_src_EDGE_PLATING',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Edge plating',
title_i18n : '',
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'edge_plating_length',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Edge plating Length',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'ATS_technology_25dc',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '2.5 DC Technology',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'ATS_technology_25dr',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '2.5 DR Technology',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'gold_finger',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Gold Finger',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'glod_finger_area',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Glod Finger Area',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
,
{
default_value_mode : 'spec',
display_style : {"pack" : {"column_span" : 2}},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'stack_vias_more',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Stack Vias >= 12 layer(for above 14 AL)',
title_i18n : {},
tooltip : '',
type : 'jobattr',
validate : '',
}
],
default_value_mode : '',
display_style : {"type" : "FormGridLayout",
"property" : {"columns" : 4}},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'original_items_layout1',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'layout',
title_i18n : {},
tooltip : '',
type : 'layout',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'original_items',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Original Items',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
,
{
CHILDREN :
[
{
default_value_mode : 'customize',
display_style : {"validateSignal" : "anyDataChanged()",
"initCallback" : function (obj, self) {
obj.setShowGrid(true);
obj.setDataKeyList(["item", "laser_cutting_length", "base_on_which_layer"]);
obj.setHeaderItem([
{},
{
name: 'item',
display: 'Item',
dataType: "string",
displayRole: "$item"
},
{
name: 'laser_cutting_length',
display: 'Length',
dataType: "string",
displayRole: "$laser_cutting_length"
},
{
name: 'base_on_which_layer',
display: 'Base on which layer',
dataType: "string",
displayRole: "$base_on_which_layer"
},
]);
},
"setter" : function (obj, value, self) {
var itemList = ["Front", "Back"];
var loadList = [];
if ((value != '') && (value != undefined)) {
var dataList = JSON.parse(value);
var tempMap = {};
for (var i = 0; i < dataList.length; i++) {
var valueMap = dataList[i];
valueMap["item"] = itemList[i];
loadList.push(valueMap);
}
obj.loadData(loadList);
}
// else {
// for (var i = 0; i < itemList.length; i++) {
// var valueMap = {};
// valueMap["item"] = itemList[i];
// loadList.push(valueMap);
// }
// obj.loadData(loadList);
// }
},
"getter" : function (obj, self) {
return JSON.stringify(obj.allDataMap());
},
"property" : {"minimum_height" : 200},
"type" : "TableView"},
getter_func : function () {
try {
var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var selector = new TSqlSelectorV2;
selector.setTable("pdm_job_work_layer");
selector.setField(["name"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('type', 'outer');
selector.setOrder("row_num", 1);
var layerList = query.selectArrayValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
selector.clear();
selector.setTable("pdm_job_layerattr");
selector.setField(["attr_name", "layer", "value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', layerList);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
var dataMap = {};
_.each(attrList, function (valueMap) {
var tempList = [];
if (!_.isEmpty(dataMap[valueMap["layer"]])) {
tempList = dataMap[valueMap["layer"]];
}
tempList.push(valueMap);
dataMap[valueMap["layer"]] = tempList;
})
var retMap = {};
for (var key in dataMap) {
var tempMap = {};
_.each(dataMap[key], function (itemMap) {
tempMap[itemMap["attr_name"]] = itemMap["value"];
})
retMap[key] = tempMap;
}
var itemList = ["top", "bottom"];
var retList = [];
_.each(itemList, function (item) {
var tempMap = retMap[item];
retList.push(tempMap);
})
return JSON.stringify(retList);
}
catch (e) {
print(e);
GUI.msgbox({
title: 'Error',
detail: e
});
}
},
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'laser_cutting_length_tableview',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'laser_cutting_length',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Laser cutting Length(m)',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
,
{
default_value_mode : 'customize',
display_style : {"validateSignal" : "anyDataChanged()",
"initCallback" : function (obj, self) {
obj.setShowGrid(true);
obj.setDataKeyList(["item", "remark"]);
obj.setHeaderItem([
{},
{
name: 'item',
display: 'Item',
dataType: "string",
displayRole: "$item",
size: "510"
},
{
name: 'remark',
display: 'Layer Information',
dataType: "string",
displayRole: "$remark"
},
]);
},
"setter" : function (obj, value, self) {
var itemList = ["LDI Layers Check Base on Org Info", "Layers with Line Width <60 um", "Layers with Laser A/R <60 um(Maybe changed After laser size Changed)"];
var loadList = [];
if ((value != '') && (value != undefined)) {
var dataList = JSON.parse(value);
for (var i = 0; i < dataList.length; i++) {
var valueMap = dataList[i];
valueMap["item"] = itemList[i];
loadList.push(valueMap);
}
obj.loadData(loadList);
}
// } else {
// for (var i = 0; i < itemList.length; i++) {
// var valueMap = {};
// valueMap["item"] = itemList[i];
// loadList.push(valueMap);
// }
// obj.loadData(loadList);
// }
},
"getter" : function (obj, self) {
return JSON.stringify(obj.allDataMap());
},
"property" : {"minimum_height" : 200},
"type" : "TableView"},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'remark_tableview',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : '',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
,
{
CHILDREN :
[
{
default_value_mode : 'customize',
display_style : {"type" : "DateEdit"},
getter_func : function () {
try {
var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var selector = new TSqlSelectorV2;
selector.setTable("pdm_job_jobattr");
selector.setField(["value"]);
selector.setWhere("job_id", this.jobId);
selector.addWhere("attr_name","import_date")
var date = query.selectValue(selector);
if (query.lastError().isValid()) {
throw query.lastError();
}
return date;
}
catch (e) {
print(e);
GUI.msgbox({
title: 'Error',
detail: e
});
}
},
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'partnumber_layout1_customize2',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Import Date',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
,
{
default_value_mode : 'customize',
display_style : '',
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'partnumber_layout1_customize3',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'Source',
title_i18n : {},
tooltip : '',
type : 'customize',
validate : '',
}
],
default_value_mode : '',
display_style : {"type" : "FormGridLayout",
"property" : {"columns" : 2}},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'all_layout2',
save_value_func : '',
set_value_condition : '',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'layout',
title_i18n : {},
tooltip : '',
type : 'layout',
validate : '',
}
],
default_value_mode : 'Spec',
display_style : {"type" : "Widget"},
getter_func : '',
interface : '',
layer_list : '',
merge_func : '',
merge_mode : '',
merge_param : '',
name : 'all_category',
save_value_func : '',
set_value_condition : 'default',
set_value_func_pars : '',
set_value_mode : '',
setter_func : '',
state : '',
title : 'All',
title_i18n : {},
tooltip : '',
type : 'category',
validate : '',
}
]
\ 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