Commit 67fabe19 authored by Scott Sun's avatar Scott Sun

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

parents 5c754241 1218d449
## wistarn
* 100 rule更改 ok
* 101 102 103(profile错误) 7z压缩包
* 104 多套gerber文件
* 106 107 113 147 无文件
* 114 profile 直接创建失败
* 136 139 144 多套数据
* 141 tgz+gerber多套
\ No newline at end of file
......@@ -137,7 +137,6 @@ var resultData = [];
var ALL = {}
var Omatrix = {};
try {
console.log("=============================================>anaysis_start");
var par = PAR;
var vc_src_01005_pad_result = par.vc_src_01005_pad_result
......@@ -152,7 +151,7 @@ try {
// 检查料号是否能够check out
if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode == "aimdfm"){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
script_info({ result_severity: "analysis start" })
script_info({ msg: "analysis start" })
script_info({ progress: 65 })
var pcs_step = par.pcs_step == "" ? "cad" : par.pcs_step;
var array_step = par.array_step == "" ? "stp" : par.array_step;
......@@ -163,7 +162,9 @@ try {
if(step_list.indexOf(pcs_step)<0){
pcs_step = step_list[0]
}
script_info({ result_severity: "analysis update_matrix_info" })
script_info({ msg: "analysis update_matrix_info" })
script_info({ progress: 65 })
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
GEN.openStep({job:job, name:pcs_step})
......@@ -219,7 +220,7 @@ try {
})
GEN.clearLayers()
script_info({ result_severity: "analysis drill_stack" })
script_info({ msg: "analysis drill_stack" })
script_info({ progress: 70 })
// * new 钻孔叠构
var cam_drill_structure = []
......@@ -361,7 +362,7 @@ try {
rmOutProfile({job:job, step:pcs_step})
}
GEN.closeStep()
script_info({ result_severity: "analysis panel_info" })
script_info({ msg: "analysis panel_info" })
script_info({ progress: 70 })
// * profile 和 拼版
var pandle_step = step_list.map(function(v){
......@@ -435,7 +436,7 @@ try {
}
ALL.gold_fingers = gold_fingers
GEN.closeStep()
script_info({ result_severity: "analysis some_job_info" })
script_info({ msg: "analysis some_job_info" })
var config = {
jobInfo: {
layer_count: ["signal","power_ground"], // Board属性的signal或者power_ground层
......@@ -515,7 +516,7 @@ try {
console.log("===================================> 5 save drill info")
script_info({ result_severity: "analysis drill_info" })
script_info({ msg: "analysis drill_info" })
script_info({ progress: 75 })
// * 获取pcs_step 和 array_step的钻孔信息
var drill_tool_info = {};
......@@ -530,6 +531,7 @@ try {
name:par.array_step
}
]
steps_drillinfo.forEach(function(item){
var type = item.type;
var step = item.name;
......@@ -537,7 +539,7 @@ try {
drillLayers.forEach(function(layer){
var layer = layer.name;
if(!GEN.isLayerEmpty({job:job,step:step,layer:layer})){
GEN.COM("tools_set,layer="+layer+",slots=by_length")
// GEN.COM("tools_set,layer="+layer+",slots=by_length")
var tool = GEN.getTool({job:job,step:step,layer:layer,units:"mm"}); // {"1":{"count":"01156","num":"1","type":"plated","min_tol":"0","max_tol":"0","finish_size":"100.31","drill_size":"100.31","slot_len":"0","type2":"standard","shape":"hole","bit":0}}
if(!drill_tool_info[layer]){
drill_tool_info[layer] = tool;
......@@ -639,7 +641,7 @@ try {
})
console.log("=============================> 6 set smd bga")
script_info({ result_severity: "analysis smd&bga" })
script_info({ msg: "analysis smd&bga" })
script_info({ progress: 80 })
var allStep = GEN.getStepList({job:job})
allStep.forEach(function(step){
......@@ -783,6 +785,7 @@ try {
jobid: JobId,
jobinfohash: {ATS_surface_area_base_on:"Card"}
})
var jobpath = GEN.getJobPath({job:job})
// if(GEN.GEN_TYPE == "genesis"){
// jobpath = GEN.getJobPath({job:job})
......@@ -790,7 +793,7 @@ try {
// jobpath = "/home/local_db/server_db/jobs/"+job
// }
mkPath(jobpath,["user","opcam","steps"])
script_info({ result_severity: "analysis signal" })
script_info({ msg: "analysis signal" })
script_info({ progress: 85 })
stepList.forEach(function(step){
GEN.openStep({ job: job, name: step })
......@@ -943,7 +946,7 @@ try {
if(par.erf){
tmpitem.erf = par.erf
}
script_info({ result_severity: "analysis run_signal_chk" })
script_info({ msg: "analysis run_signal_chk" })
createChklistAndRun({ // 创建checklist并运行
layers: signalLayers,
items: [tmpitem]
......@@ -982,11 +985,30 @@ try {
GEN.checkInout({job:job,mode:"in"})
}
var job_attrs = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field_format:{job_attrs:'json'},
field:'job_attrs',
where:{id : JobId}
})
});
if (!job_attrs ) { job_attrs = {}}
job_attrs.readin_result = "已读入"
db.query("",function(q){
return q.updateRow({
table:'pdm_job',
data:{job_attrs:job_attrs},
update_policy:{attr_data:'json_merge'},
where:{id : JobId}
})
});
IKM.msg("export")
script_info({ result_severity: "analysis export" })
script_info({ msg: "analysis export" })
script_info({ progress: 95 })
// 导出
if(par.export_path != "" && par.export_mode != "" && par.export_submode != "" ){
......@@ -1012,11 +1034,11 @@ try {
})
});
var err = mail.sendMail({
host:'smtp.exmail.qq.com',
auth_method:mail.AuthMethod.LOGIN,
host:"10.90.79.37",
port:"25",
connection_type:mail.ConnectionType.TCP,
from:'scott.sun@topibd.com',
password:'159482673Sun',
// user:'ferre.zhang@cn.ats.net',
// password:'159482673Sun',
to:'scott.sun@topibd.com',
subject:db_customer + ' / '+job+' reading is ready!',
content:db_customer + ' / '+job+' reading is ready!'
......@@ -1025,8 +1047,6 @@ try {
print(err.text());
}
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
......@@ -1114,7 +1134,27 @@ function ANALYSIS_STACKUP(props){
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}});
save_job_info({jobid:JobId,jobcategory:props.jobcategory,jobinfohash:{TL_layer_count:layer_count}});
var job_attrs = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field_format:{job_attrs:'json'},
field:'job_attrs',
where:{id : JobId}
})
});
if (!job_attrs ) { job_attrs = {}}
job_attrs.layer_count = layer_count
db.query("",function(q){
return q.updateRow({
table:'pdm_job',
data:{job_attrs:job_attrs},
update_policy:{attr_data:'json_merge'},
where:{id : JobId}
})
});
_.values(matrix).sort(function(a,b){return a.row-b.row}).forEach(function(layer){
layer.odb_name = layer.name;
layer.name = layer.tl_name;
......@@ -1248,6 +1288,7 @@ function selCopyLayer(props){ // 拷贝选择的到辅助层
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){
......@@ -1257,7 +1298,6 @@ function save_job_info(props){ // 保存料号信息
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({
......@@ -2017,6 +2057,7 @@ function analysisDrill(par, step){
GEN.workLayer({name:item,display_number:1,clear_before:"yes"})
GEN.COM("filter_set,filter_name=popup,update_popup=no,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})
// GEN.selRefFeat({layers:tmplayer, use:"filter",mode:"touch"})
GEN.COM("filter_reset,filter_name=popup")
if(GEN.getSelectCount()>0){
var res = ""
......@@ -2026,7 +2067,7 @@ function analysisDrill(par, step){
return /^r\d+/.test(item.symbol)
})
pads = pads.sort(function(a,b){
return parseInt(a.symbol) - parseInt(b.symbol)
return parseInt(a.symbol.slice(1)) - parseInt(b.symbol.slice(1))
})
res = pads[0].symbol.slice(1)
}
......
......@@ -68,7 +68,7 @@ if (mode === "aimdfm") {
var Status = 'ok';
var resultData = [];
try {
script_info({ result_severity: "format start" })
script_info({ msg: "format start" })
script_info({ progress: 35 })
var par = PAR;
if(!par.hasOwnProperty("config_path") || par.config_path==""){
......@@ -128,7 +128,8 @@ try {
}
}
if(/string/ig.test(typeof(mergeRule.drill[0]))){ // drill层 计算
var drill_layers = []
var drill_layers = [];
var tmp_layers = [];
var matrix = GEN.getMatrix({job:job})
// 计算最大值
var layers = Object.keys(matrix)
......@@ -144,6 +145,7 @@ try {
var tmp = reg.exec(v)
var num1 = Number(tmp[1])
var num2 = Number(tmp[2])
tmp_layers.push({num1:num1,num2:num2,layer:v})
if(num1==1){
drill_layers.push({num1:num1,num2:num2,layer:v})
}
......@@ -152,6 +154,10 @@ try {
}
})
var max = maxnum.sort(function(a,b){return b-a})[0]
if (drill_layers.length > 0 && String(drill_layers[0].num2) == "NaN") {
var maxLayer = tmp_layers.filter(function(v) {return v.num1 == max})
GEN.COM("matrix_rename_layer",{job:job,matrix:"matrix",layer:maxLayer[0].layer,new_name:"drill"})
}
var drill_layer = drill_layers.filter(function(v){return v.num2 == max})
if(drill_layer.length){
drill_layer = drill_layer[0].layer
......@@ -204,7 +210,6 @@ try {
profileRule = mergeRule.profile
}
}
// start martix_tl_name
console.log("get matrix ====== ======== job:" + job);
var matrix = GEN.getMatrix({job:job});
......@@ -224,7 +229,7 @@ try {
// 改名
script_info({ result_severity: "format rename" })
script_info({ msg: "format rename" })
script_info({ progress: 50 })
err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
if(err){throw err}
......@@ -285,7 +290,7 @@ try {
err = setDrill({job:job})
if(err){throw err}
script_info({ result_severity: "format create profile" })
script_info({ msg: "format create profile" })
script_info({ progress: 55 })
var all_layer = Object.keys(tmp_matrix)
// 没有outline层
......@@ -296,7 +301,7 @@ try {
GEN.openStep({job:job, name:tmp_step})
var now_profile = GEN.getProfile({job:job, step:tmp_step})
if(now_profile.match(/\n/ig).length == 1){ // 如果没有profile
if(profileRule[0] == "outline") {
if(profileRule[0] == "outline" && /1352/ig.test(PAR.customer)) {
GEN.workLayer({name:'outline',display_number:2,clear_before:'yes'})
GEN.selAllFeat()
if(GEN.getSelectCount() > 0) {
......@@ -312,7 +317,7 @@ try {
}
var hasProfile = GEN.getProfile({job:job, step:tmp_step})
if(hasProfile.match(/\n/ig).length == 1){
script_info({ result_severity: "创建profile失败" })
script_info({ msg: "创建profile失败" })
throw "创建profile失败"
}
}
......@@ -331,7 +336,6 @@ try {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
result_severity: "format ok",
progress: 60
},
where: { id: $.task_id }
......@@ -600,6 +604,7 @@ function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名
}
function mergeLaser(props){ // 合并钻孔
var tmp = []
if(!props.mergeRule){return}
var mergeRuleRegs = props.mergeRule.regs
var mergeTlname = props.mergeRule.tl_name
......@@ -644,12 +649,18 @@ function mergeLaser(props){ // 合并钻孔
newdrills.push(layerName.toLowerCase())
}
GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
if(/drl|drill/ig.test(val.name) && tmp.indexOf(val.name) < 0) {
tmp.push(val.name)
}
})
}
}
GEN.affectedLayer({affected:"no",mode:"all"});
GEN.clearLayers();
tmp.forEach(function(layer) {
GEN.COM("matrix_rename_layer,job="+job+",matrix=matrix,layer="+layer+",new_name="+layer.replace(/drl|drill/, "merage"))
})
GEN.closeStep();
return newdrills
}
......@@ -657,7 +668,6 @@ function mergeLaser(props){ // 合并钻孔
function createOutline(props){
var profileRule = props.profileRule
console.log("----profileRule------->:" + _.toString(profileRule));
var job = props.job
var step = props.step
var matrix = GEN.getMatrix({job:job})
......@@ -671,15 +681,25 @@ function createOutline(props){
})
return flag
})
console.log("---- outlines------->:" + _.toString(outlines));
var drill_layer = Object.keys(matrix).filter(function(v){return matrix[v].layer_type=="drill" && matrix[v].context == "board"})
var tmp = "drill_all";
if(GEN.isLayerExists({job:job, layer:tmp})) { GEN.deleteLayer({job:job, layer:tmp})}
GEN.openStep({job:job, name:step})
GEN.affectedLayer({affected:'yes',layer:drill_layer})
if(GEN.isLayerExists({job:job, layer:tmp})) { GEN.deleteLayer({job:job, layer:[tmp]})}
drill_layer.forEach(function(d_layer) {
GEN.workLayer({name:d_layer,display_number:2,clear_before:'yes'})
GEN.selCopyOther({dest:'layer_name',target_layer:tmp,invert:'no',dx:0,dy:0,size:0})
})
GEN.closeStep()
if (outlines.indexOf("outline") >= 0) {
outlines = outlines.reduce(function(a,b){
if(b != "outline") {
a.push(b)
}
return a
}, ["outline"])
}
var tmp_outline
if(outlines.length){
if( outlines.length){
......@@ -696,7 +716,7 @@ function createOutline(props){
}
}else{return false}
function cl(l){
GEN.openStep({job:job, name:step})
GEN.openStep({job:job, name:step})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.workLayer({name:l,display_number:2,clear_before:"yes"})
var bk = l + "_bk"
......@@ -795,4 +815,4 @@ function script_info(props){ // result_severity progress
where: { id: $.task_id }
});
}
}
\ No newline at end of file
}
......@@ -86,9 +86,10 @@ if (mode === "aimdfm") {
}
var Status = 'ok';
var resultData = [];
var import_info = []
var import_info = [];
var inputState = [];
try {
script_info({ result_severity: "import start" })
script_info({ msg: "import start" })
var par = PAR;
// var db_path = db.query("",function(q){
// return q.selectValue({
......@@ -163,18 +164,41 @@ try {
} else {
jobFiles = fs.listDir(jobFile[0].path)
}
GEN.COM("config_edit,name=iol_gbr_polygon_break,value=1,mode=user")
GEN.COM("config_edit,name=iol_fix_ill_polygon,value=yes,mode=user")
// GEN.COM("config_edit,name=iol_gbr_polygon_break,value=1,mode=user")
// GEN.COM("config_edit,name=iol_fix_ill_polygon,value=yes,mode=user")
// 将jobFile下的zip解压
decompression(jobFile[0].path, [])
var job_attrs = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field_format:{job_attrs:'json'},
field:'job_attrs',
where:{id : JobId}
})
});
if (!job_attrs ) { job_attrs = {}}
if (inputState.indexOf("rar") >=0 || inputState.indexOf("7z") >=0) {
job_attrs.readin_result = "解压失败-格式无法识别"
} else {
job_attrs.readin_result = "已读入"
}
db.query("",function(q){
return q.updateRow({
table:'pdm_job',
data:{job_attrs:job_attrs},
update_policy:{attr_data:'json_merge'},
where:{id : JobId}
})
});
jobFiles = fs.listDir(jobFile[0].path)
// 分析料号文件 得到料号导入信息 导入类型
var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job })
if(jobInfo.data.length == 0){
script_info({ result_severity: "file error" })
script_info({ msg: "file error" })
throw "file error"}
var importOk = false; // 是否成功导入
......@@ -277,7 +301,7 @@ try {
GEN.COM("input_manual")
importOk = true
}
if(!importOk){ script_info({ result_severity: "import error" }); throw "import error"}
if(!importOk){ script_info({ msg: "import error" }); throw "import error"}
script_info({ progress: 20 })
reNameStep(job)
if(/2171/.test(par.customer)){
......@@ -314,7 +338,7 @@ try {
}
})
}
GEN.closeStep()
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
......@@ -332,7 +356,7 @@ try {
import_html += "</table>"
// name type date user
resultData.push({type: "info",title:"导入资料列表",detail: [{ desc: import_html }] })
script_info({ result_severity: "import ok" })
script_info({ msg: "import ok" })
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
......@@ -371,7 +395,6 @@ function delSameJob(props){
var job = props.job
var delSame = props.delSame
console.log("======================>delsame:"+ delSame);
if(GEN.isJobExists({job:job})){
if(/^yes$/ig.test(delSame)){
if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
......@@ -511,10 +534,14 @@ function script_info(props){ // result_severity progress
}
}
function decompression(path, zips) {
var files = fs.listDir(path)
var count = 0;
var zipfiles = files.filter(function(item){
if (item.suffix == "zip" || item.suffix == "rar" || item.suffix == "7z") {
inputState.push(item.suffix)
}
if(item.suffix === "zip" && zips.indexOf(item.path) < 0){
if(item.name.length >= 20) {
var mvname = "zip_custom" + count + ".zip";
......
......@@ -190,8 +190,8 @@
"Excellon2_4": {
"nf1": 2,
"nf2": 3,
"units": "mm",
"zeroes": "leading",
"units": "inch",
"zeroes": "trailing",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
......@@ -201,7 +201,7 @@
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
......@@ -679,6 +679,7 @@
GEN.COM("tools_set,layer="+layer+",thickness=0,user_params=,slots=by_length")
}
})
GEN.saveJob({ job: job });
}
}
]
......@@ -828,7 +829,7 @@
{
"valid": function(props){
var file = props.file;
return /.+\.ger$/ig.test(file.name) || /\.gdo$|\.bol$|\.gdo$|\.pma$|\.sma$|\.smb$|\.ssa$|\.ssb$/ig.test(file.name) ||
return /.+\.ger$/ig.test(file.name) || /\.pho$|\.bol$|\.gdo$|\.pma$|\.pmb$|\.spa$|\.spb$\.sma$|\.smb$|\.ssa$|\.ssb$/ig.test(file.name) ||
/.+\.l\d+$/ig.test(file.name)
},
"type": "Gerber274x",
......@@ -943,25 +944,32 @@
}
],
"tl_name": [
{"orig_name" : ["^pmt\\.art$","\\.pma$","SoldPasteTop\\.ger","past_top"], "tl_name" : "past_top" },
{"orig_name" : ["^pmb\\.art$","\\.pmb$","SoldPasteBot\\.ger","past_botm"], "tl_name" : "past_botm" },
{"orig_name" : ["tsilk","^sst\\.art$","\\.ssa$","SilkScrnTop\\.ger","silk_top"], "tl_name" : "silk_top" },
{"orig_name" : ["bsilk","^ssb\\.art$","\\.ssb$","SilkScrnBot\\.ger","silk_bot"], "tl_name" : "silk_bot" },
{"orig_name" : ["tmask","^smt\\.art$","\\.sma$","SoldMask1Top\\.ger","sm_top"], "tl_name" : "sm_top" },
{"orig_name" : ["bmask","^smb\\.art$","\\.smb$","SoldMask1Bot\\.ger","sm_bot"], "tl_name" : "sm_botm" },
{"orig_name" : ["^top$","^top.art$"], "tl_name" : "top" },
{"orig_name" : ["^l(\\d+).*\\.art$","^v(\\d+)\\.art$","^g(\\d+)\\.art$","^s(\\d+)\\.art$","\\.l(\\d+)$","Copper(\\d+)\\.ger$","^layer_(\\d+)"], "tl_name" : "l_($1)"},
{"orig_name" : ["^bot\\.art$","^bottom$","^bottom.art$"], "tl_name" : "bottom" },
{"orig_name" : ["^pmt\\.art$","\\.pma$|\\.spa$","paste.top|soldPasteTop|pastemask.?top","past_top"], "tl_name" : "past_top" },
{"orig_name" : ["^pmb\\.art$","\\.pmb$|\\.spb$","paste.bot|soldPasteBot|pastemask.?bot","past_botm"], "tl_name" : "past_botm" },
{"orig_name" : ["tsilk","^sst\\.art$","\\.ssa$","silkscrntop|silkscreentop","silk.top|silk-top"], "tl_name" : "silk_top" },
{"orig_name" : ["bsilk","^ssb\\.art$","\\.ssb$","silkscrnbot|silkscreenbot","silk.bot|silk-bot"], "tl_name" : "silk_bot" },
{"orig_name" : ["tmask","^smt\\.art$","\\.sma$","soldmask1top|soldermask.?top","sm.top|solder.top"], "tl_name" : "sm_top" },
{"orig_name" : ["bmask","^smb\\.art$","\\.smb$","soldmask1bot|soldermask.?bot","sm.bot|solder.bot"], "tl_name" : "sm_botm" },
{"orig_name" : ["^(?:(?!assy|enig|pm|past|paste|silk|mask).)+top\\.(pho|art)$","^top$","^top\\.art$"], "tl_name" : "top" },
{"orig_name" : ["^(?:(?!ref).)+l(\\d)\\.art$","-(\\d+)l\\.pho$","^l(\\d+).*\\.art$","^v(\\d+)\\.art$","^g(\\d+)\\.art$","^s(\\d+)\\.art$","\\.l(\\d+)$","Copper(\\d+)\\.ger$","^layer_(\\d+)"], "tl_name" : "l_($1)"},
{"orig_name" : ["^(?:(?!assy|enig|pm|past|paste|silk|mask).)+bot\\.(pho|art)$","^bot\\.art$","^bottom$","^bottom.art$"], "tl_name" : "bottom" },
{"orig_name" : ["\\.d(\\d+)$"], "tl_name" : "d_($1)-($1+1)"},
{"orig_name" : ["thruHolePlated_(\\d+)_(\\d+)\\.ncd","(\\d+)-(\\d+)\\.drl$","^drill(\\d+)-(\\d+)$","^d_(\\d+)-(\\d+)$"], "tl_name" : "d_($1)-($2)"},
{"orig_name" : ["ThruHoleNonPlated\\.ncd$","^drill$"], "tl_name" : "drill" },
{"orig_name" : ["(\\d+)-(\\d+)-np\\.drl$","ThruHoleNonPlated\\.ncd$","^drill$"], "tl_name" : "drill" },
{"orig_name" : ["\\.rou$","^rout$"], "tl_name" : "rout" },
{"orig_name" : "fab.art", "tl_name" : "fab.art" },
{"orig_name" : ["multipack.art","^array$"], "tl_name" : "array" },
{"orig_name" : ["outline\\.art$","\\.bol$","PnlContourNonPlated\\.ger","^outline"], "tl_name" : "outline" },
{"orig_name" : ["top-enig","enig_top"], "tl_name" : "enig_top" },
{"orig_name" : ["bot-enig","enig_bot"], "tl_name" : "enig_bot" },
]
{"orig_name" : ["multipack\\.art","^array$"], "tl_name" : "array" },
{"orig_name" : ["p_outline\\.art","panel\\.art$","paneloutline\\.pho","outline\\.art$","\\.bol$","PnlContourNonPlated\\.ger","^outline"], "tl_name" : "outline" },
{"orig_name" : ["topside-golden","top-enig","enig_top"], "tl_name" : "enig_top" },
{"orig_name" : ["botside-golden","bot-enig","enig_bot"], "tl_name" : "enig_bot" },
],
"mergerule" : {
profile:["silk_top"],
laser : {
tl_name: "drill($1)-($2)",
regs: ["(\\d+)-(\\d+)\\.drl$"]
}
}
},
"Vivo":{
"step": "cad",
......
"use strict";
var fs = require("fs");
var db = require('topsin.database');
var error = require('topsin.error');
......@@ -20,10 +19,8 @@ try {
if (query_1.lastError().isValid()){
throw query_1.lastError().text()};
// 获取远程文件夹
console.log(1);
var samba = fs.listDir("\\\\10.90.2.100\\samba", 1);
console.log(2);
throw "tmp"
var sambaDirs_1 = [];
var sambaFiles_1 = [];
samba.forEach(function (v) {
......
let mail = require('topsin.mail');
let error = require('topsin.error');
var mail = require('topsin.mail');
var error = require('topsin.error');
var err = mail.sendMail({
host:'smtp.exmail.qq.com',
auth_method:mail.AuthMethod.LOGIN,
// host:'smtp.exmail.qq.com',
// host:'cshas.ats.net',
host:"10.90.79.37",
port:"25",
// auth_method:mail.AuthMethod.LOGIN,
connection_type:mail.ConnectionType.TCP,
from:'scott.sun@topibd.com',
password:'159482673Sun',
// user: "ferre.zhang@cn.ats.net",
// user:'scott.sun@topibd.com',
// password:'159482673Sun',
to:'scott.sun@topibd.com',
subject:'customer_code / job_name reading is ready!',
content:'customer_code / job_name reading is ready!'
......@@ -13,4 +17,7 @@ var err = mail.sendMail({
if (err.isValid()) {
print(err.text());
}
\ No newline at end of file
}
......@@ -487,13 +487,6 @@ try {
GEN.closeStep()
})
......
......@@ -4,10 +4,22 @@ DESCRIPTION: ;
PARAMETER:
[
{
name : 'step',
title : 'step',
name : 'ring_size',
title : 'ring大小',
type : 'IntLineEdit',
property : {tool_tip : 'ring大小'},
},
{
name : 'line_size',
title : '优化线径值',
type : 'IntLineEdit',
property : {tool_tip : '优化线径值'},
},
{
name : 'step_fliter',
title : 'Step过滤',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
property : {tool_tip : 'unit'},
},
{
name : 'auto_save',
......@@ -24,16 +36,16 @@ PARAMETER:
]
VERSION_HISTORY:
V1.00 2020-09-01 Scott Sun
V1.00 2020-04-28 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 标题 </p>
<p> 隔离环优化 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> step信息 </p>
<p> 配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
......@@ -42,7 +54,10 @@ PARAMETER:
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>template");
console.log("==============================>JTG_INN_neg_isolation_pad_optimization_aim");
/* question
?
*/
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
......@@ -50,100 +65,211 @@ const { padStart } = require('lodash');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
require("topsin.genmath")
var genMath = new GenMath();
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var db = $.db || IKM.db;
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if ($.par) {
PAR = $.par
} else if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title
},
where: { id: $.task_id }
});
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
step: "orig",
auto_save: "No",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
var par = PAR;
var default_par = { // par默认参数?
step_fliter:"unit",
units: "mm",
auto_save: "no",
ring_size:200,
line_size:200
}
for(var key in default_par){ // 设置默认属性
if (!par.hasOwnProperty(key) || par[key] == ""){
par[key] = default_par[key]
}
}
var par_props = ["ring_size","line_size"] // par的必填参数
par_props.forEach(function(v){
if(par[v] == ""){throw "par props "+v+" err"}
})
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}) }
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
if(mode == "aimdfm"){
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
}
// 脚本开始
var stepList = GEN.getStepList({job:job})
stepList = stepList.filter(function(step){
var reg = new RegExp(par.step,"ig")
return reg.test(step)
if(par.step_fliter != ""){
var step_reg = new RegExp(par.step_fliter)
stepList = stepList.filter(function(v){return step_reg.test(v)})
}
// 通过matrix中选择属性为negative&power_ground&inner的内层负片层
var matrix = GEN.getMatrix({job:job})
var n_layers = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
.filter(function(key){
var val = matrix[key]
return val.layer_type == "power_ground" && val.polarity == "negative" && val.side == "inner" && val.context == "board"
})
stepList.forEach(function(step){
GEN.openStep({job:job,name:step})
GEN.clearLayers(); //清除层显示
GEN.affectedLayer({ mode: 'all', affected: 'no' }); //设置影响层全部不影响
GEN.COM("sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
GEN.units({ type: par.units });
GEN.zoomHome();
var feas = GEN.getFeatures({job:job,step:step,layer:"tmp",surface:1,units:"mm"})
IKM.msg(featsToLimits(feas))
if(n_layers.length == 0){throw "can not find power_ground negative layer"}
var tmp1 = "tmp_1", tmp2 = "tmp_2"
var tmp_layers = [tmp1,tmp2];
stepList.forEach(function(step){
GEN.openStep({job:job, name:step})
GEN.units({type:par.units})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.clearLayers()
n_layers.forEach(function(layer){
// 逐层制作,过滤选出 rect*,r*,s*,oval 属性的物件并移动到辅助层1;
tmp_layers.forEach(function(v){
if(GEN.isLayerExists({job:job,layer:v})){GEN.deleteLayer({job:job, layer:v})}
GEN.createLayer({job:job, layer:v})
})
GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
GEN.selectByFilter({include_syms:"rect*;r*;s*;oval*"})
if(GEN.getSelectCount()>0){
GEN.selMoveOther({target_layer:tmp1,invert:'no',dx:0,dy:0,size:0})
// 复制辅助层1至辅助层2,将辅助层1上的物件修改为r1.2;
GEN.workLayer({name:tmp1,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
GEN.selCopyOther({dest:'layer_name',target_layer:tmp2,invert:'no',dx:0,dy:0,size:0})
GEN.selChangeSym({symbol:"r1.2"})
// 使用参考选择reference select命令touch辅助层1,筛选出drl层上有隔离焊盘的孔;
GEN.workLayer({name:"drl",display_number:2,clear_before:'yes'})
if(!GEN.isLayerExists({job:job, layer:"pth"})){
GEN.selectByFilter({attribute:[{attribute:'.drill',option:'plated'}]})
if(GEN.getSelectCount() > 0) {GEN.selCopyOther({dest:'layer_name',target_layer:'pth',invert:'no',dx:0,dy:0,size:0})}
}
if(!GEN.isLayerExists({job:job, layer:"np"})){
GEN.selectByFilter({attribute:[{attribute:'.drill',option:'non_plated'}]})
if(GEN.getSelectCount() > 0) {GEN.selCopyOther({dest:'layer_name',target_layer:'np',invert:'no',dx:0,dy:0,size:0})}
}
if(GEN.isLayerExists({job:job, layer:"pth"})){
GEN.workLayer({name:"pth",display_number:2,clear_before:'yes'})
GEN.selRefFeat({layers:tmp1,use:'filter',mode:'touch'})
// copy这些选中的孔到辅助层2,resize设置为400um; par.ring_size
if(GEN.getSelectCount()>0){
GEN.selCopyOther({dest:'layer_name',target_layer:tmp2,invert:'no',dx:0,dy:0,size:par.ring_size})
}
}
if(GEN.isLayerExists({job:job, layer:"np"})){
GEN.workLayer({name:"np",display_number:2,clear_before:'yes'})
GEN.selRefFeat({layers:tmp1,use:'filter',mode:'touch'})
// copy这些选中的孔到辅助层2,resize设置为400um; par.ring_size
if(GEN.getSelectCount()>0){
GEN.selCopyOther({dest:'layer_name',target_layer:tmp2,invert:'no',dx:0,dy:0,size:par.ring_size + 50})
}
}
GEN.workLayer({name:tmp2,display_number:2,clear_before:'yes'})
var del_layer = tmp2 + "+++"
GEN.runSingleDfm({
chklist: 'valor_dfm_nfpr',
params: {
pp_layer: tmp2,
pp_delete: 'Duplicate',
pp_work: 'Features',
pp_drill: 'PTH\;NPTH\;Via',
pp_remove_mark: 'Remove'
}
})
GEN.deleteLayer({job:job,layer:del_layer})
// 将辅助层2上的物件move至对应的内层负片层
GEN.workLayer({name:tmp2,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
GEN.selCopyOther({dest:'layer_name',target_layer:layer,invert:'no',dx:0,dy:0,size:0})
}
})
})
GEN.deleteLayer({job:job, layer:tmp_layers})
// 逐层分析内层负片层的物件,如存在小于200um的线,则将线宽优化至200um。 par.line_size
stepList.forEach(function(step){
GEN.openStep({job:job, name:step})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.clearLayers()
GEN.selClearFeature()
n_layers.forEach(function(layer){
GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
var syms = GEN.getLayerSymsHist({job:job,step:step,layer:layer})
var change_syms = []
for(var key in syms){
var v = syms[key]
if(v.size && v.size < par.line_size){
change_syms.push(key)
}
}
GEN.selectByFilter({feat_types:"line", include_syms:change_syms.join(";")})
if(GEN.getSelectCount()>0){GEN.selDelete()}
})
GEN.closeStep()
})
GEN.deleteLayer({job:job, layer:tmp_layers})
// 保存
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"})}
if (mode === "aimdfm") {
$.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}; }
}else { return "Done" }
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"})
}
console.log("======================== JTG_INN_neg_isolation_pad_optimization_aim end");
if (mode === "aimdfm") {
$.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
};
}
}else {
return "Done"
}
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
IKM.msg(_.join(GEN.STATUS, "\n"))
IKM.msg(e)
Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
function featsToLimits(feats) {
feats.forEach(function(item) {
if(item.feats) {
var polygon = genMath.profile2Polygon(item.feats.join("\n"),0)
var res = polygon.reduce(function(a,b){
a.xmin = b.x > a.xmin ? a.xmin : b.x;
a.ymin = b.y > a.ymin ? a.ymin : b.y;
a.xmax = b.x < a.xmax ? a.xmax : b.x;
a.ymax = b.y < a.ymax ? a.ymax : b.y;
return a
}, {
xmin: polygon[0].x,
ymin: polygon[0].y,
xmax: polygon[0].x,
ymax: polygon[0].y
})
res.xsize = Math.abs(res.xmax - res.xmin)
res.ysize = Math.abs(res.ymax - res.ymin)
res.xc = res.xmin + res.xsize/2
res.yc = res.ymin + res.ysize/2
item.limits = res
}
})
return feats
}
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
\ No newline at end of file
......@@ -178,17 +178,17 @@ try {
var workstep = getWorkStep()
if(!Array.isArray(workstep)){throw "工作step错误"}
// var err = createCoverLayer({workstep:workstep}) // 创建套层
// if (err) {throw err}
// GEN.PAUSE("createCoverLayer end; please check")
var err = createCoverLayer({workstep:workstep}) // 创建套层
if (err) {throw err}
GEN.PAUSE("createCoverLayer end; please check")
// var err = ssFrameSeparate({workstep:workstep}) // 分离文字和文字框
// if (err) {throw err}
// GEN.PAUSE("ssFrameSeparate end; please check")
var err = ssFrameSeparate({workstep:workstep}) // 分离文字和文字框
if (err) {throw err}
GEN.PAUSE("ssFrameSeparate end; please check")
// var err = slBoxOptimize({workstep:workstep}) // 文字框优化
// if (err) {throw err}
// GEN.PAUSE("slBoxOptimize end; please check")
var err = slBoxOptimize({workstep:workstep}) // 文字框优化
if (err) {throw err}
GEN.PAUSE("slBoxOptimize end; please check")
var err = slOptimize({workstep:workstep}) // 文字优化
if (err) {throw err}
......
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