Commit b9d75c41 authored by Scott Sun's avatar Scott Sun

s

parent 33a8d68a
...@@ -56,6 +56,7 @@ var fs = require('fs'); ...@@ -56,6 +56,7 @@ var fs = require('fs');
var _ = require('lodash'); var _ = require('lodash');
var JobId = $.job_id; var JobId = $.job_id;
var database = require("topsin.database"); var database = require("topsin.database");
var Omatrix = {};
database.addConnection($.conf.database_conf, "DFM"); database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM"); var QDfm = database.query("DFM");
if ($.conf.product_type == "aimdfm") { if ($.conf.product_type == "aimdfm") {
...@@ -176,7 +177,6 @@ try { ...@@ -176,7 +177,6 @@ try {
// todo 设置钻孔层孔属性,镭射孔via,无铜孔npth,其余孔pth // todo 设置钻孔层孔属性,镭射孔via,无铜孔npth,其余孔pth
// todo 上传钻孔信息
// 获取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;
...@@ -246,7 +246,7 @@ try { ...@@ -246,7 +246,7 @@ try {
// smd // smd
var smdInfo; var smdInfo;
try { try {
if(!analysis_obj.matrixInfo.mOuters.solderL){throw "no mask"} if(!analysis_obj.matrixInfo.mOuters[0].solderL){throw "no mask"}
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)
...@@ -257,7 +257,7 @@ try { ...@@ -257,7 +257,7 @@ try {
console.log("===================================> 7 bga info") console.log("===================================> 7 bga info")
var bgaInfo; var bgaInfo;
try { try {
if(!analysis_obj.matrixInfo.mOuters.solderL){throw "no mask"} 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)
...@@ -283,6 +283,7 @@ try { ...@@ -283,6 +283,7 @@ 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"
...@@ -297,7 +298,22 @@ try { ...@@ -297,7 +298,22 @@ try {
} }
stepList.forEach(function(step){ stepList.forEach(function(step){
GEN.openStep({ job: job, name: step }) GEN.openStep({ job: job, name: step })
// 曝光
analysis_obj.matrixInfo.mOuters.forEach(function(item){
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: {
// }
// })
}
})
GEN.clearLayers() GEN.clearLayers()
GEN.affectedLayer({ affected: 'no', mode: 'all' }) GEN.affectedLayer({ affected: 'no', mode: 'all' })
// 创建chklist并运行 如果chklist存在先删除 // 创建chklist并运行 如果chklist存在先删除
...@@ -446,57 +462,45 @@ function UPLOAD_LAYER_MATRIX(props){ ...@@ -446,57 +462,45 @@ function UPLOAD_LAYER_MATRIX(props){
var job = props.job var job = props.job
props.jobcategory = props.jobcategory || "work" props.jobcategory = props.jobcategory || "work"
var matrix = ANALYSIS_STACKUP({job:job, jobcategory:props.jobcategory}); var matrix = ANALYSIS_STACKUP({job:job, jobcategory:props.jobcategory});
var func = 'function(ARGV)\ var layers = Object.keys(matrix).sort(function(a,b){return matrix[a]["row"] - matrix[b]["row"]})
{\ var tableName = "pdm_job_" + props.jobcategory + "_layer";
var jobId = ARGV["job_id"];\ console.log("===========>matrix upload");
var tableName = "pdm_job_" + ARGV["jobcategory"] + "_layer";\ var oLayers = db.query("",function(q){
//GUI.msgbox({text: TDataParse.variant2JsonStr(tableName)});\ return q.selectMapMap({
var db = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());\ table:tableName,
db.begin();\ field: ["odb_name", "release_status"],
try{\ where:{job_id:JobId},
var oLayers = db.selectMapMap({table:tableName, field:["odb_name","release_status"], where:{job_id:jobId}, uniquefield:"odb_name"});\ uniquefield: "odb_name"
if (db.lastError().isValid()) throw db.lastError();\ })
//GUI.msgbox({text: TDataParse.variant2JsonStr(oLayers)});\ });
\ db.query("",function(q){
db.deleteRow({table:tableName, where:{job_id:jobId}});\ return q.deleteRow({
if (db.lastError().isValid()) throw db.lastError();\ 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"];\ 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",
for (var i=0;i<ARGV["layers"].length;i++)\ "odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num"
{\ ];
layerName = ARGV["layers"][i];\ layers.forEach(function(layer){
var layerInfo = ARGV["matrix"][layerName];\ var layerInfo = matrix[layer];
var tmpData = {"job_id":jobId, "name": layerInfo["name"]};\ var tmpData = {
if (ARGV["releasestatus"] != undefined && ARGV["releasestatus"] != null && ARGV["releasestatus"].length>0\ "job_id": JobId,
&& ARGV["releasestatus"][layerInfo["odb_name"]] != undefined && ARGV["releasestatus"][layerInfo["odb_name"]] != null )\ "name": layerInfo["name"]
{\ };
tmpData["release_status"] = ARGV["releasestatus"];\ tmpData["release_status"] = (oLayers&&oLayers.hasOwnProperty(layerInfo["odb_name"])) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;
}\ for (n = 0; n < fieldLst.length; n++) {
else\ tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];
{\ }
tmpData["release_status"] = oLayers.hasOwnProperty(layerInfo["odb_name"]) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;\ db.query("",function(q){
}\ return q.insertRow({
for (n = 0; n < fieldLst.length; n++)\ table:tableName,
{\ data: tmpData
tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];\ })
}\ });
//GUI.msgbox({text: TDataParse.variant2JsonStr(tmpData)});\ })
db.insertRow({table:tableName, data:tmpData});\ console.log("===========>matrix upload end");
if (db.lastError().isValid()) throw db.lastError();\
}\
db.commit();\
return new TDataResponse();\
}\
catch (err)\
{\
print(err.text());\
db.rollback();\
return new TDataResponse(err, "");\
}\
}';
return matrix return matrix
} }
...@@ -585,6 +589,7 @@ function ANALYSIS_STACKUP(props){ ...@@ -585,6 +589,7 @@ function ANALYSIS_STACKUP(props){
function getMatrixInfo(props){ // 获取matrix各种信息 function getMatrixInfo(props){ // 获取matrix各种信息
var job = props.job var job = props.job
var matrix = GEN.getMatrix({job:job}) var matrix = GEN.getMatrix({job:job})
Omatrix = matrix;
var res = { var res = {
matrix: matrix, // matrix matrix: matrix, // matrix
matrixVal: [], // matrix 的 value数组 matrixVal: [], // matrix 的 value数组
...@@ -680,6 +685,9 @@ function save_job_info(props){ // todo 保存料号信息 ...@@ -680,6 +685,9 @@ function save_job_info(props){ // todo 保存料号信息
function save_layerinfo(props){ // todo 保存层信息 function save_layerinfo(props){ // todo 保存层信息
var jobid = props.jobid; var jobid = props.jobid;
var layer = props.layer; var layer = props.layer;
if(Omatrix[layer] && 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){
var val = layerinfohash[key]; var val = layerinfohash[key];
...@@ -953,6 +961,7 @@ function smdAnalysis(props){ ...@@ -953,6 +961,7 @@ function smdAnalysis(props){
GEN.openStep({job:job,step:step}) GEN.openStep({job:job,step:step})
layers.forEach(function(layer){ layers.forEach(function(layer){
// 计算开窗 数量 // 计算开窗 数量
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'}) GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
if (!res.hasOwnProperty(layer.solderL)){ if (!res.hasOwnProperty(layer.solderL)){
res[layer.solderL] = {} res[layer.solderL] = {}
...@@ -961,6 +970,7 @@ function smdAnalysis(props){ ...@@ -961,6 +970,7 @@ function smdAnalysis(props){
GEN.selAllFeat() GEN.selAllFeat()
res[layer.solderL].sm_opening_count = GEN.getSelectCount() res[layer.solderL].sm_opening_count = GEN.getSelectCount()
GEN.selClearFeature() GEN.selClearFeature()
}
// 分析最小smd宽高 // 分析最小smd宽高
GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'}) GEN.workLayer({name:layer.signalL,display_number:2,clear_before:'yes'})
GEN.selClearFeature() GEN.selClearFeature()
...@@ -982,6 +992,7 @@ function smdAnalysis(props){ ...@@ -982,6 +992,7 @@ function smdAnalysis(props){
var min_smd_pitch = smdPitch({job:job,step:step,layer:tmp_layer}) var min_smd_pitch = smdPitch({job:job,step:step,layer:tmp_layer})
res[layer.signalL]["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.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
GEN.selClearFeature() GEN.selClearFeature()
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'}) GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'})
...@@ -995,6 +1006,7 @@ function smdAnalysis(props){ ...@@ -995,6 +1006,7 @@ function smdAnalysis(props){
res[layer.signalL].min_smd_opening_width = 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"] 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})
} }
}) })
...@@ -1266,6 +1278,7 @@ function min_symbols_anal(props){ // 分析最小symbols ...@@ -1266,6 +1278,7 @@ function min_symbols_anal(props){ // 分析最小symbols
// 尺寸 // 尺寸
res.min_bga_size = symbols.size res.min_bga_size = symbols.size
// 开窗大小 // 开窗大小
if(layer.solderL){
GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'}) GEN.workLayer({name:layer.solderL,display_number:2,clear_before:'yes'})
GEN.selClearFeature() GEN.selClearFeature()
GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'}) GEN.selRefFeat({layers:tmp_layer,use:'filter',mode:'include'})
...@@ -1281,10 +1294,10 @@ function min_symbols_anal(props){ // 分析最小symbols ...@@ -1281,10 +1294,10 @@ function min_symbols_anal(props){ // 分析最小symbols
} }
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
GEN.deleteLayer({job:job,layer:solderL_tmp})
}
// 间距 // 间距
res.min_bga_pitch = bgaPitch({job:job,step:step,layer:tmp_layer}) res.min_bga_pitch = bgaPitch({job:job,step:step,layer:tmp_layer})
GEN.deleteLayer({job:job,layer:solderL_tmp})
GEN.deleteLayer({job:job,layer:tmp_layer}) GEN.deleteLayer({job:job,layer:tmp_layer})
return res return res
} }
...@@ -1371,7 +1384,7 @@ function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的 ...@@ -1371,7 +1384,7 @@ function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的
var min_pad_symbols = GEN.getLayerSymsHist({job:job,layer:min_pad_layer,step:step}) 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] 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 res.bga_min_pitch_pad_size = min_pad_symbol.size
if(solder_layer){
// 最小pitch开窗大小 // 最小pitch开窗大小
GEN.workLayer({name:solder_layer,display_number:1,clear_before:'yes'}); GEN.workLayer({name:solder_layer,display_number:1,clear_before:'yes'});
GEN.selClearFeature() GEN.selClearFeature()
...@@ -1386,6 +1399,8 @@ function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的 ...@@ -1386,6 +1399,8 @@ function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的
res.bga_min_pitch_openging_size = symbols_solder_list.sort(function(a,b){return Number(a.size)-Number(b.size)})[0].size 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:solder_layer_tmp})
}
GEN.deleteLayer({job:job,layer:min_pad_layer}) GEN.deleteLayer({job:job,layer:min_pad_layer})
GEN.deleteLayer({job:job,layer:min_pitch_layer}) GEN.deleteLayer({job:job,layer:min_pitch_layer})
GEN.deleteLayer({job:job,layer:tmp_layer}) GEN.deleteLayer({job:job,layer:tmp_layer})
......
...@@ -122,7 +122,7 @@ try { ...@@ -122,7 +122,7 @@ try {
// 如果genesis已经存在这个料号 // 如果genesis已经存在这个料号
err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err}; err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
var custCfg = config.customer[par.customer] var custCfg = config.customer[par.customer]
if(!custCfg){throw "config error"} if(!custCfg){throw "customer config error:"+par.customer}
custCfg.db = par.db || custCfg.db custCfg.db = par.db || custCfg.db
var step = custCfg.step.toLowerCase() var step = custCfg.step.toLowerCase()
// 获取路径下文件信息 // 获取路径下文件信息
......
...@@ -369,6 +369,18 @@ function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名 ...@@ -369,6 +369,18 @@ function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名
GEN.renameLayer({job:job,layer:v.orig_name,new_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})
var topSignal = signals[0]
var botSignal = signals[signals.length -1]
if(topSignal !== "top"){
GEN.renameLayer({job:job,layer:topSignal,new_name:"top"})
}
if(botSignal !== "bottom"){
GEN.renameLayer({job:job,layer:botSignal,new_name:"bottom"})
}
} }
function mergeDrill(props){ // 合并钻孔 function mergeDrill(props){ // 合并钻孔
......
...@@ -205,7 +205,7 @@ ...@@ -205,7 +205,7 @@
{"orig_name" : ["_isl(\\d+)_bottom"], "tl_name" : "d_($1)-($1+1)"} {"orig_name" : ["_isl(\\d+)_bottom"], "tl_name" : "d_($1)-($1+1)"}
] ]
}, },
"yucca": { "Yucca": {
"step": "cad", "step": "cad",
"rules": [ "rules": [
{ {
......
...@@ -11,8 +11,16 @@ var JobId = $.job_id; ...@@ -11,8 +11,16 @@ var JobId = $.job_id;
try { try {
IKM.msg(1) var job = "4"
var tmp = [{signalL:"top",solderL:"sm_top"}, {signalL:"top",solderL:null}]
// exposed
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" return "Done"
} catch (e) { } catch (e) {
IKM.msg(e) IKM.msg(e)
......
var func = function (ARGV) { try {
var jobId = ARGV["job_id"]; var query = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
var tableName = "pdm_job_" + ARGV["jobcategory"] + "_layer"; var selector = new TSqlSelectorV2;
//GUI.msgbox({text: TDataParse.variant2JsonStr(tableName)}); selector.setTable("pdm_job_work_layer");
var db = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase()); selector.setField(["name"]);
db.begin(); selector.setWhere("job_id", this.jobId);
try { selector.addWhere('type', 'outer');
var oLayers = db.selectMapMap({ selector.setOrder("row_num", 1);
table: tableName, var layerList = query.selectArrayValue(selector);
field: ["odb_name", "release_status"], if (query.lastError().isValid()) {
where: { throw query.lastError();
job_id: jobId }
},
uniquefield: "odb_name"
});
if (db.lastError().isValid()) throw db.lastError();
//GUI.msgbox({text: TDataParse.variant2JsonStr(oLayers)});
db.deleteRow({ selector.clear();
table: tableName, selector.setTable("pdm_job_layerattr");
where: { selector.setField(["attr_name", "layer", "value"]);
job_id: jobId selector.setWhere("job_id", this.jobId);
selector.addWhere('layer', layerList);
var attrList = query.selectArrayMap(selector);
if (query.lastError().isValid()) {
throw query.lastError();
} }
});
if (db.lastError().isValid()) throw db.lastError(); selector.clear();
selector.setTable("pdm_job_work_layer");
var fieldLst = ["name", "odb_context", "odb_type", "odb_polarity", "odb_side", "drl_start", "drl_end", selector.setField(["odb_name", "side"]);
"row_num", "type", "drl_start_num", "drl_end_num", "drl_from_num", "drl_to_num", "drl_connect_to", selector.setWhere("job_id", this.jobId);
"odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num" selector.addWhere('odb_context', 'board');
]; selector.setOrder("type", "solder_mask");
var nameList = query.selectArrayMap(selector);
for (var i = 0; i < ARGV["layers"].length; i++) { if (query.lastError().isValid()) {
layerName = ARGV["layers"][i]; throw query.lastError();
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]]; 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"];
} }
//GUI.msgbox({text: TDataParse.variant2JsonStr(tmpData)}); })
db.insertRow({
table: tableName, var dataMap = {};
data: tmpData _.each(attrList, function (valueMap) {
}); var tempList = [];
if (db.lastError().isValid()) throw db.lastError(); if (!_.isEmpty(dataMap[valueMap["layer"]])) {
tempList = dataMap[valueMap["layer"]];
} }
db.commit();
return new TDataResponse(); tempList.push(valueMap);
} catch (err) { dataMap[valueMap["layer"]] = tempList;
print(err.text()); })
db.rollback();
return new TDataResponse(err, ""); 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
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