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

s

parent 91f888e4
var config = { var config = {
"formats": { "formats": {
"ODB1": { "ODB": {},
"comments": "", // 描述 "ODB_1": {
"comments": "",
"arrStep": "stp", "arrStep": "stp",
"isMerge": "yes", "isMerge": "yes"
"jobNameRule": "(job)-a"
}, },
"Gerber274_1": { "Gerber274x_1": {
"nf1": 3, "nf1": 3,
"nf2": 0, "nf2": 5,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Gerber274x_2": {
"nf1": 3,
"nf2": 5,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_1": {
"nf1": 3,
"nf2": 5,
"units": "mm", "units": "mm",
"zeroes": "leading", "zeroes": "leading",
"decimal": "yes", "decimal": "no",
"nf_comp": 0, "nf_comp": 0,
"break_sr": "yes", "break_sr": "yes",
"data_type": "ascii", "data_type": "ascii",
...@@ -26,15 +66,55 @@ var config = { ...@@ -26,15 +66,55 @@ var config = {
"signed_coords": "no", "signed_coords": "no",
"text_line_width": 0.0024 "text_line_width": 0.0024
}, },
"Excellon1_1": { "Excellon2_2": {
"nf1": 3, "nf1": 2,
"nf2": 4, "nf2": 3,
"units": "mm", "units": "inch",
"zeroes": "leading", "zeroes": "leading",
"decimal": "no", "decimal": "no",
"nf_comp": 0, "nf_comp": 0,
"break_sr": "yes", "break_sr": "yes",
"data_type": "ascii", "data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_3": {
"nf1": 2,
"nf2": 5,
"units": "inch",
"zeroes": "trailing",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"IPC356_1": {
"nf1": 2,
"nf2": 4,
"units": "inch",
"zeroes": "none",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*", "separator": "*",
"threshold": 200, "threshold": 200,
"drill_only": "no", "drill_only": "no",
...@@ -47,48 +127,501 @@ var config = { ...@@ -47,48 +127,501 @@ var config = {
"text_line_width": 0.0024 "text_line_width": 0.0024
} }
}, },
"cust": { "customer": {
"c1": { "Customer_2": {
"path": "C:/Users/Administrator/Desktop/Customer_1", "path": "C:/Users/Administrator/Desktop/Customer_2",
"db": "genesis", "db": "genesis",
"step": "cad",
"rules": [ "rules": [
{ {
"valid": "", // 文件正则 func true/false "valid": function(props){
"type": "ODB", // 格式 odb gerber var file = props.file;
"format": "ODB1" return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
}, },
{ {
"valid": "", // 文件正则 func "valid": function(props){
"type": "Gerber274", // 格式 odb gerber var file = props.file;
"format": "Gerber274_1" return /.+\.ipc$/ig.test(file.name)
},
"type": "IPC356",
"format": "IPC356_1"
}, },
{ {
"valid": "", // 文件正则 func "valid": function(props){
"type": "Excellon1", // 格式 odb gerber var file = props.file;
"format": "Excellon1_1", return /.+\.rou$/ig.test(file.name)
"rename": {} },
"type": "Excellon2",
"format": "Excellon2_3"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"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/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/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
}
}
}
} }
], ],
"tlname": [ "tl_name": [
{"orig_name" : "pasttop.art", "tlname" : "past_top" }, {"orig_name" : "pasttop.art", "tl_name" : "past_top" },
{"orig_name" : "pleg.art", "tlname" : "silk_top" }, {"orig_name" : "pleg.art", "tl_name" : "silk_top" },
{"orig_name" : "soldtop.art", "tlname" : "sm_top" }, {"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
{"orig_name" : "art(\\d+)\\.art", "tlname" : "layer_(1)"}, {"orig_name" : "top.art", "tl_name" : "top" },
{"orig_name" : "soldbotm.art", "tlname" : "sm_botm" }, {"orig_name" : "lay(\\d+)\\.art", "tl_name" : "l_($1)"},
{"orig_name" : "sleg.art", "tlname" : "silk_bot" }, {"orig_name" : "bottom.art", "tl_name" : "bottom" },
{"orig_name" : "pastbotm.art", "tlname" : "past_botm" }, {"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
{"orig_name" : "multipack.art", "tlname" : "array" }, {"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
{"orig_name" : "outline.art", "tlname" : "outline" }, {"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
{"orig_name" : "fab.art", "tlname" : "fab.art" }, {"orig_name" : "multipack.art", "tl_name" : "array" },
{"orig_name" : "top-enig", "tlname" : "top-enig" }, {"orig_name" : "outline.art", "tl_name" : "outline" },
{"orig_name" : "bot-enig", "tlname" : "bot-enig" }, {"orig_name" : "fab.art", "tl_name" : "fab" },
{"orig_name" : "fab_page2", "tlname" : "fab_page2" } {"orig_name" : "top-enig", "tl_name" : "top-enig" },
{"orig_name" : "bot-enig", "tl_name" : "bot-enig" },
{"orig_name" : "fab_page2", "tl_name" : "fab_page2" },
{"orig_name" : ["-(\\d+)-(\\d+)\.drl","(\\d+)-(\\d+)-laser\.drl"], "tl_name" : "d_($1)-($2)"}
]
},
"Customer_1": {
"path": "C:/Users/Administrator/Desktop/Customer_1",
"db": "genesis",
"step": "cad",
"rules": [
{
"valid": function(props){
var file = props.file;
var job = props.job;
var reg = new RegExp("^"+job+"-a","ig")
return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
},
"type": "ODB",
"format": "ODB_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_1"
}
]
},
"New_data": {
"path": "C:/Users/Administrator/Desktop/New data",
"db": "genesis",
"step": "pcs",
"rules": [
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_2"
}
] ]
} }
}, },
"sort_rename": [ "data_format": [
{"tlname":"" , "newname":"" } // newname 里支持特殊变量 {"tl_name":"^top$" , "new_name":"top" , "attr":{ "context":"board", "type":"signal" }}, // new_name 里支持特殊变量
] {"tl_name":"l_(\\d+)","new_name":"layer_($1)" ,"attr":{"context":"board","type":"signal"}},
{"tl_name":"^bottom$","new_name":"bottom" ,"attr":{"context":"board","type":"signal"}},
{"tl_name":"d_(\\d+)-(\\d+)","new_name":"d($1)-($2)" ,"attr":{"context":"board","type":"drill"}},
{"tl_name":"drill","new_name":"drill" ,"attr":{"context":"board","type":"drill"}},
{"tl_name":"rout","new_name":"rout" ,"attr":{"context":"board","type":"rout"}}
],
"delSameJob": "yes"
}
module.exports = config
/*
(function(){
return {
"formats": {
"ODB": {},
"ODB_1": {
"comments": "",
"arrStep": "stp",
"isMerge": "yes"
},
"Gerber274x_1": {
"nf1": 3,
"nf2": 5,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Gerber274x_2": {
"nf1": 3,
"nf2": 5,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_1": {
"nf1": 3,
"nf2": 5,
"units": "mm",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_2": {
"nf1": 2,
"nf2": 3,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_3": {
"nf1": 2,
"nf2": 5,
"units": "inch",
"zeroes": "trailing",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"IPC356_1": {
"nf1": 2,
"nf2": 4,
"units": "inch",
"zeroes": "none",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
}
},
"customer": {
"Customer_2": {
"path": "C:/Users/Administrator/Desktop/Customer_2",
"db": "genesis",
"step": "cad",
"rules": [
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.ipc$/ig.test(file.name)
},
"type": "IPC356",
"format": "IPC356_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.rou$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_3"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"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/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/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
}
}
}
}
],
"tlname": [
{"orig_name" : "pasttop.art", "tlname" : "past_top" },
{"orig_name" : "pleg.art", "tlname" : "silk_top" },
{"orig_name" : "soldtop.art", "tlname" : "sm_top" },
{"orig_name" : "art(\\d+)\\.art", "tlname" : "layer_(1)"},
{"orig_name" : "soldbotm.art", "tlname" : "sm_botm" },
{"orig_name" : "sleg.art", "tlname" : "silk_bot" },
{"orig_name" : "pastbotm.art", "tlname" : "past_botm" },
{"orig_name" : "multipack.art", "tlname" : "array" },
{"orig_name" : "outline.art", "tlname" : "outline" },
{"orig_name" : "fab.art", "tlname" : "fab.art" },
{"orig_name" : "top-enig", "tlname" : "top-enig" },
{"orig_name" : "bot-enig", "tlname" : "bot-enig" },
{"orig_name" : "fab_page2", "tlname" : "fab_page2" }
]
},
"Customer_1": {
"path": "C:/Users/Administrator/Desktop/Customer_1",
"db": "genesis",
"step": "cad",
"rules": [
{
"valid": function(props){
var file = props.file;
var job = props.job;
var reg = new RegExp("^"+job+"-a","ig")
return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
},
"type": "ODB",
"format": "ODB_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_1"
}
]
},
"New_data": {
"path": "C:/Users/Administrator/Desktop/New data",
"db": "genesis",
"step": "pcs",
"rules": [
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_2"
}
]
}
},
"sort_rename": [
{"tlname":"" , "newname":"" }
],
"delSameJob": "yes"
}
})()
} */
\ No newline at end of file \ No newline at end of file
// 引入模块 包
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;
try {
var config = require("../config.js") // 读取配置文件
var cfg = IKM.select_value({table:'pub_conf',field:'text_data',where:{path : 'cam/input_data'}})
var par = { // todo
job:"I6",
customer: "Customer_2"
}
// var config = eval(cfg)
var job = par.job.toLowerCase();
// 如果genesis已经存在这个料号
err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
var custCfg = config.customer[par.customer]
var step = custCfg.step.toLowerCase()
// 获取路径下文件信息
var pathInfo = fs.listDir(custCfg.path, 1)
// 判断存不存在料号文件
var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job})
if(jobFile.length == 0){throw "job file is not exist"}
var jobFiles = [] // 记录要分析的文件
if (!jobFile[0].isDir) {
jobFiles.push(jobFile[0])
} else {
jobFiles = fs.listDir(jobFile[0].path)
}
var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job })
var importOk = false;
if(/odb/ig.test(jobInfo.type)){ // odb导入
if(jobInfo.data.length == 0){throw "file error"}
if(jobInfo.data.length == 1){
var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob)
if(err){throw err}
} else {
var mergeFiles = jobInfo.data.filter(function(item){
var err = importJob({name:item.file.baseName,db:custCfg.db,path:item.file.path},config.delSameJob)
if(err){throw err}
return /yes/ig.test(item.format.isMerge)
})
var arr_job = mergeFiles[0]
GEN.openJob({job:job});
GEN.openJob({job:arr_job.file.baseName});
GEN.copyStep({
source_job:arr_job.file.baseName,
source_name:arr_job.format.arrStep,
dest_job:job,
dest_name:arr_job.format.arrStep,
});
GEN.closeJob({ job: arr_job.file.baseName });
GEN.deleteJob({ job: arr_job.file.baseName });
}
importOk = true
}
if(/gerber/ig.test(jobInfo.type)){ // gerber导入
GEN.createJob({name:job,db:custCfg.db})
GEN.createStep({job:job,name:step})
var gerberInfo = jobInfo.data.map(function(item){
var gerberCfg = JSON.parse(JSON.stringify(item.format));
var file = item.file
gerberCfg.layer = file.name.toLowerCase()
gerberCfg.path = file.path
gerberCfg.format = item.type
gerberCfg.job = job
gerberCfg.step = step
return gerberCfg
})
GEN.COM("input_manual_reset")
gerberInfo.forEach(function(v){
GEN.COM("input_manual_set",v)
})
GEN.COM("input_manual")
importOk = true
}
if(!importOk){throw "import error"}
var matrix = GEN.getMatrix({job:job});
comp = Object.keys(matrix).filter(function(v){
return /^comp_\+_/ig.test(v)
})
if (comp.length > 0){
var tmp = GEN.getStepList({job:job})
GEN.openStep({job:job,name:tmp[0]})
GEN.COM("delete_comp")
GEN.closeStep()
}
GEN.checkInout({job:job,mode:"out"}) // 自动保存
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
return 'Done';
}
catch (error) {
GUI.msg(error)
return 'Error';
}
function delSameJob(props){
var job = props.job
var delSame = props.delSame
if(GEN.isJobExists({job:job})){
if(/^yes$/ig.test(delSame)){
if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
GEN.deleteJob({job:job})
} else {
return "job "+ job+ " exist"
}
}
}
function analyJobFiles(props){
var files = props.jobFiles;
var config = props.config;
var job = props.job;
var custCfg = props.custCfg;
var rules = custCfg.rules;
var paramsFile = files.filter(function(file){return /param/ig.test(file.baseName)})
var tmp_hash = {}
paramsFile.forEach(function(file){
tmp_hash[file.baseName] = (function(){
var tmparr = fs.readFile(file.path).split("\n")
var tmp = {}
tmparr.map(function(v){
var arr = v.split(/\b\s+\b/)
tmp[arr[0].replace(/-/ig,"_")] = arr[1]
})
return tmp
})()
})
var fileInfo = files.reduce(function(a,file){
try {
rules.forEach(function(item){
if(item.valid({file:file, job:job})){
var format = config.formats[item.format]
var format1;
if(item.format_params){
format1 = item.format_params({params:tmp_hash})
}
if(format1){
throw {file:file,type:item.type,format:format1}
}else{
throw {file:file,type:item.type,format:format}
}
}
})
} catch (info) {
a.push(info)
}
return a
},[])
var odbfiles = fileInfo.filter(function(item){return /odb/ig.test(item.type)})
if(odbfiles.length == 0){
return {
type: "Gerber",
data: fileInfo
}
} else {
return {
type: "ODB",
data: odbfiles
}
}
}
function importJob(props,delSameJob){
var name = props.name
if (GEN.isJobExists({ job: name })) {
if (/^yes$/ig.test(delSameJob)) {
if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); }
GEN.deleteJob({ job: name });
}
else {
return "job "+name+" exist";
}
}
GEN.importJob(props);
}
/*
NAME:
DESCRIPTION: matrix改名和排序
PARAMETER:
[
{
name : 'customer',
title : 'CUSTOMER 名',
type : 'LineEdit',
property : {tool_tip : '客户名称'}
},
{
name : 'job_name',
title : '料号名',
type : 'LineEdit',
property : {tool_tip : '料号名'}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> matrix改名和排序</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> matrix改名和排序规则 </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;
try {
var mode = "develop" // develop
var config = require("../config.js") // 读取配置文件
var par = { // todo
job:"I3",
customer: "Customer_2"
}
var job = par.job.toLowerCase(); // 获取料号
var custCfg = config.customer[par.customer] // 获取客户配置
var step = custCfg.step.toLowerCase() // 获取pcs_step
// 料号验证
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
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"});
// 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
// tl_name_matrix.forEach(function(item){
// IKM.add({name:item.name, tl_name:item.tl_name})
// })
// IKM.add("",1)
var format_cfg = config.data_format // 拿到数据标准化配置
// 排序和设属性
var ret = sortLayer({job:job, rule:format_cfg, 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:format_cfg})
if(err){throw err}
return 'Done';
}
catch (error) {
GUI.msg(error);
return 'Error';
}
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){
tlname_rules.push({
orig_name: name2,
tl_name: item.tl_name
})
})
}
})
IKM.msg(tlname_rules)
var res = Object.keys(matrix).map(function(key){
var val = matrix[key]
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})}
}
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)
}
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;
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 })
}
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.context == "board"
})
// 获取所有single层
var signalLayer =matrix.filter(function(v){
return v.attr.type == "signal" && v.attr.context == "board"
})
var layerCount = GEN.getLayerCount({job:job})
// 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 == "drill" || v=="rout"){
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})
}
});
}
function mergeDrill(props){ // 合并钻孔
var newdrills = []
var job = props.job;
var step = GEN.getStepList({job:job})[0];
var maxDrill = {name:"",value:0};
function getDrl(str){
var num = /(\d+)-(\d+)/ig.exec(str); // 匹配出 num-num
var tmp = [];
for(var i = Number(num[1]);i<num[2];i++){
if(i == 1){
maxDrill = Number(num[2]) > maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
}
tmp.push("L"+i+"-"+(i+1));
}
return tmp;
}
var matrix = GEN.getMatrix({job:job});
GEN.openStep({job : job,name:step});
for(var key in matrix){
var val = matrix[key];
if(val.layer_type == "drill"){
var mergeTo = getDrl(val.name) // 要合并到的地方
mergeTo.forEach(function(layerName){
if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
}
if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){
GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
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()});
})
}
}
// 合并到maxDrill独立合并
GEN.createLayer({job:job,layer:"b1-"+maxDrill.value,conext:'board',type:'drill'});
GEN.workLayer({name:"b1-"+maxDrill.value,display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"b1-"+maxDrill.value});
GEN.affectedLayer({affected:"no",mode:"all"});
GEN.closeStep();
return this;
}
/*
NAME:
DESCRIPTION: matrix改名和排序
PARAMETER:
[
{
name : 'customer',
title : 'CUSTOMER 名',
type : 'LineEdit',
property : {tool_tip : '客户名称'}
},
{
name : 'job_name',
title : '料号名',
type : 'LineEdit',
property : {tool_tip : '料号名'}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> matrix改名和排序</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> matrix改名和排序规则 </p>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
*/
// 引入模块 包 // 引入模块 包
var $ = require('topcam.scriptfunc').argv(); var $ = require('topcam.scriptfunc').argv();
var fs = require('fs'); var fs = require('fs');
...@@ -6,475 +41,308 @@ var IKM = $.ikm; ...@@ -6,475 +41,308 @@ var IKM = $.ikm;
var GEN = $.gen; var GEN = $.gen;
var GUI = $.gui; var GUI = $.gui;
var Job = $.job; var Job = $.job;
var JobId = $.job_id;
try { try {
var cfg = JSON.parse(IKM.select_value({table:'pub_conf',field:'json_data',where:{path : 'cam/input_data'}})); // 读取配置文件 var mode = "develop" // develop
var useCfg = cfg.ats; // todo 选择使用哪个客户的配置 var config = require("../config.js") // 读取配置文件
addDefaultCfg(cfg.def, useCfg) // 添加默认配置 var par = { // todo
/* useCfg 测试配置 job:"I3",
"job": "1", customer: "Customer_2"
"path": "C:/Users/Administrator/Desktop/Customer_1",
"step": "cad",
"ODB": {
"db": "genesis",
"files": ["tgz"],
"arrStep": "stp",
"isMerge": "yes",
"jobNameRule": "(job)-a"
},
"Gerber": {
"db": "genesis",
"files": ["drd", "drl", "phd", "phl"],
"editFile": [{
"filter": "drd",
"callback": "function(props){}"
}],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Wheel",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
}
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
*/
// todo job来源
var job = "1" || "demo", path = useCfg.path, step = useCfg.step, err;
err = delSameJob({job:job, delSame:useCfg.delSameJob}); if(err){throw err}
// 判断导入方式 处理path
var jobPath = path + "/" + job
if(!fs.exists(jobPath)){throw "path error"}
var pathInfo = getPathInfo({path:jobPath, cfg: useCfg}) // 分析path下的文件
if(!pathInfo.type){throw "file error"} // pathInfo.type "ODB" or "Gerber"
var input_ok = false // 判断是不是导入成功
// 分支 导入ODB
if(pathInfo.type == "ODB"){
var odb = useCfg.ODB
var fileInfo = getFileInfo({inputConfig:odb, path:jobPath, files:pathInfo.files}) // 获取导入文件信息
if(/^yes$/ig.test(odb.isMerge) && fileInfo.length > 1){
var err = mergeJob({odb:odb,job:job,fileInfo:fileInfo,delSameJob:useCfg.delSameJob})
if(err){throw err}
} else {
var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0]
if(jobInfo.length==0){throw "file error"}
var err = importJob({name:job,db:odb.db,path:jobInfo.path},useCfg.delSameJob)
if(err){throw err}
}
input_ok = true
}
// 分支 导入Gerber
if(pathInfo.type == "Gerber"){
var gerber = useCfg.Gerber
// 如果要修改文件
if(gerber.editFile && gerber.editFile.length){
// 将文件拷贝一份到_tmp
var tmpDir = path + "/" + job + "_tmp"
if(!fs.exists(tmpDir)){fs.mkdir(tmpDir)}
var srcFiles = []
pathInfo.files.forEach(function(v){
srcFiles.push(v)
fs.copyFile(v.path,tmpDir + "/" + v.name,true)
})
jobPath = tmpDir
pathInfo.files = fs.listDir(tmpDir,1)
// 配置操作
gerber.editFile.forEach(function(item){
var filter = item.filter
var fn = eval(item.callback)
pathInfo.files.forEach(function(file){
var reg = new RegExp(file.suffix, "ig")
if(reg.test(filter)){
fn.call({},{fs: fs, nowFile: file, srcFiles: srcFiles})
}
})
})
}
var fileInfo = getFileInfo({inputConfig:gerber, path:jobPath, files:pathInfo.files}) // 获取导入文件信息
// 导入gerber数据
importGerber({job:job,step:step,gerber:gerber,fileInfo:fileInfo})
input_ok = true
} }
var job = par.job.toLowerCase(); // 获取料号
var custCfg = config.customer[par.customer] // 获取客户配置
var step = custCfg.step.toLowerCase() // 获取pcs_step
if(!input_ok){throw "input failed"} // 料号验证
// end if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
if(/^yes$/ig.test(useCfg.isDelComp)){ // 删除comp层 if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
var matrix = GEN.getMatrix({job:job}); if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode != "develop"){ throw "the job check" }
comp = Object.keys(matrix).filter(function(v){ GEN.checkInout({job:job,mode:"out"});
return /^comp_\+_/ig.test(v)
}) // start martix_tl_name
if (comp.length > 0){ var matrix = GEN.getMatrix({job:job})
var tmp = GEN.getStepList({job:job}) var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name}) // 给matrix信息添加tl_name
GEN.openStep({job:job,name:tmp[0]}) // tl_name_matrix.forEach(function(item){
GEN.COM("delete_comp") // IKM.add({name:item.name, tl_name:item.tl_name})
GEN.closeStep() // })
} // IKM.add("",1)
}
if(/^yes$/ig.test(useCfg.autoSave)){ // 自动保存 var format_cfg = config.data_format // 拿到数据标准化配置
GEN.checkInout({job:job,mode:"out"})
GEN.saveJob({ job: job }); // 排序和设属性
} var ret = sortLayer({job:job, rule:format_cfg, matrix:tl_name_matrix})
GEN.checkInout({job:job,mode:"in"}) if(ret.err){throw err}
GEN.closeJob({job:job}) var after_sort_matrix = ret.sortNames
// 设置钻孔
err = setDrill({job:job, matrix:after_sort_matrix})
if(err){throw err}
GUI.msg("end") // 改名
err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
if(err){throw err}
return 'Done'; return 'Done';
} }
catch (error) { catch (error) {
GUI.msg(error) GUI.msg(error);
return 'Error'; return 'Error';
} }
function addDefaultCfg(def, use) { function tlNameMatrix(props){ // 设置标准名
for (var key in def) { var matrix = props.matrix
var val = def[key] var tlname_rules = []
if (typeof val == "string" && !use.hasOwnProperty(key)) { props.tl_name.forEach(function(item){
use[key] = val if(typeof item.orig_name == "string"){
} else if (typeof val == "object" && use.hasOwnProperty(key)) { tlname_rules.push(item)
if (!use[key].hasOwnProperty("db")) { } else {
use[key].db = val.db item.orig_name.forEach(function(name2){
} tlname_rules.push({
if (!use[key].hasOwnProperty("files")) { orig_name: name2,
use[key].files = val.files tl_name: item.tl_name
} })
} })
if (key == "Gerber" && use.hasOwnProperty(key)) {
for (var gkey in val.format) {
if (!use[key].hasOwnProperty("format")) {
use[key].format = val.format
} else if (!use[key].format.hasOwnProperty(gkey)) {
use[key].format[gkey] = val.format[gkey]
}
}
}
}
}
function delSameJob(props){
var job = props.job
var delSame = props.delSame
if(GEN.isJobExists({job:job})){
if(/^yes$/ig.test(delSame)){
if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
GEN.deleteJob({job:job})
} else {
return "job "+ job+ " exist"
}
}
}
function getPathInfo(props){
var path = props.path
var cfg = props.cfg
var res = {}
res.files = fs.listDir(path)
res.fileSuffix = res.files.reduce(function(a,b){
if(b.isFile && a.indexOf(b.suffix)<0){
a.push(b.suffix)
} }
return a })
},[]) IKM.msg(tlname_rules)
if(cfg.Gerber){ var res = Object.keys(matrix).map(function(key){
res.type = cfg.Gerber.files.reduce(function(a,b){ var val = matrix[key]
if(res.fileSuffix.indexOf(b) < 0){ var tlRule = tlname_rules.filter(function(rule){
a = false if(rule.orig_name === key){return true}
} var reg = new RegExp(rule.orig_name,"ig")
return a return reg.test(key)
}, true)? "Gerber" : undefined })
} if(tlRule.length == 0){return val}
if(cfg.ODB){ for(var i=0;i<tlRule.length;i++){
res.type = cfg.ODB.files.reduce(function(a,b){ if(tlRule[i].orig_name === key){return _.assign(val,{tl_name:tlRule[0].tl_name})}
if(res.fileSuffix.indexOf(b) < 0){ }
a = false 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]
} }
return a replaceArr.forEach(function(v,i){
}, true)? "ODB" : res.type tl_name = tl_name.replace("($"+(i+1)+")",v)
}
return res
}
function getFileInfo(props){
var inputConfig = props.inputConfig, path = props.path, files = props.files
var fileInfo = files.reduce(function(a,b){
if(inputConfig.files.indexOf(b.suffix)>=0){
a.push({
name:b.name,
baseName: b.baseName,
completeBaseName: b.completeBaseName,
completeSuffix: b.completeSuffix,
path: b.path,
suffix: b.suffix
}) })
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)
}
return _.assign(val,{tl_name:tl_name})
}else {
return _.assign(val,{tl_name:tlRule[0].tl_name})
} }
return a })
},[]) return res
return fileInfo
} }
function importJob(props,delSameJob){ function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则}
var name = props.name var job = props.job
if (GEN.isJobExists({ job: name })) { var matrix = GEN.getMatrix({job:job})
if (/^yes$/ig.test(delSameJob)) { var tl_matrix = props.matrix
if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); } var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
GEN.deleteJob({ job: name }); 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;
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'})
} }
else { })
return "job "+name+" exist"; 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){
GEN.importJob(props); if(i !== 0){
GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })
}
GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
})
}
return {
sortNames:sortNames
}
} }
function mergeJob(props){ function setDrill(props){ // 设置钻孔
var odb = props.odb
var job = props.job var job = props.job
var fileInfo = props.fileInfo var matrix = props.matrix
var arrJobName = odb.jobNameRule.replace("(job)", job) // 获取所有的钻孔层
var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0] var drillLayer =matrix.filter(function(v){
var arrJobInfo = fileInfo.filter(function(v){return v.baseName == arrJobName})[0] return v.attr.type == "drill" && v.attr.context == "board"
if(!jobInfo){ return "file error" } })
if(!arrJobInfo){ return "file error" } // 获取所有single层
var jobInfos = [jobInfo, arrJobInfo] var signalLayer =matrix.filter(function(v){
for(var i = 0;i<jobInfos.length;i++){ return v.attr.type == "signal" && v.attr.context == "board"
var err = importJob({name:jobInfos[i].baseName,db:odb.db,path:jobInfos[i].path},props.delSameJob) })
if(err){return err}
var layerCount = GEN.getLayerCount({job:job})
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
function findSignal(num){
return signalLayer[Number(num-1)].name
} }
// 合并操作 function doDrill(drills){ // 分析钻孔层
jobInfos.forEach(function(v){GEN.openJob({job:v.baseName})}) return drills.map(function(v){
GEN.copyStep({ if(v == "drill" || v=="rout"){
source_job:arrJobInfo.baseName, return {start:findSignal[1], end:findSignal[layerCount], layer:v.name}
source_name:odb.arrStep, } else {
dest_job:jobInfo.baseName, var tmp = /(\d+)-(\d+)/ig.exec(v.tl_name);
dest_name:odb.arrStep, if(tmp){
}); var start = findSignal(tmp[1]);
GEN.closeJob({ job: arrJobInfo.baseName }); var end = findSignal(tmp[2]);
GEN.deleteJob({ job: arrJobInfo.baseName }); 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 importGerber(props){
var fileInfo = props.fileInfo function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
var gerber = props.gerber var job = props.job
var job = props.job var matrix = props.matrix
var step = props.step var cfg = props.cfg
var gerberFiles = fileInfo.filter(function(file){return gerber.gerberConfig.hasOwnProperty(file.suffix)}) matrix = matrix.filter(function(v){return v.name != v.new_name})
var gerberInfo = gerberFiles.map(function(item){ var rename_list = matrix.map(function(item){
var gerberConfig = gerber.gerberConfig[item.suffix] || {} var new_name;
var gerberItem = { var tl_name = item.tl_name
layer: item.name.toLowerCase(), path: item.path, var rule = item.rule
format: gerber.format[item.suffix] || "Excellon2", if(rule === tl_name){
job:job,step:step 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)
}
} }
for (var key in gerberConfig) { return {
gerberItem[key] = gerberConfig[key] orig_name: item.name,
new_name: new_name
} }
return gerberItem
}) })
// 创建料号和step rename_list = rename_list.filter(function(v){
GEN.createJob({name:job,db:gerber.db}) var flag = true
GEN.createStep({job:job,name:step}) if(!v){flag = false}
// 分析geber配置 if(!v.orig_name || !v.new_name ){flag = false}
GEN.COM("input_manual_reset") return flag
gerberInfo.forEach(function(v){
GEN.COM("input_manual_set",v)
}) })
GEN.COM("input_manual") 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})
}
});
} }
function mergeDrill(props){ // 合并钻孔
/* var newdrills = []
{ var job = props.job;
"def": { var step = GEN.getStepList({job:job})[0];
"step": "pcs", var maxDrill = {name:"",value:0};
"ODB": { function getDrl(str){
"db": "genesis", var num = /(\d+)-(\d+)/ig.exec(str); // 匹配出 num-num
"files": ["tgz"] var tmp = [];
}, for(var i = Number(num[1]);i<num[2];i++){
"Gerber": { if(i == 1){
"db": "genesis", maxDrill = Number(num[2]) > maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
"files": ["drl", "art"],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Excellon2",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
} }
}, tmp.push("L"+i+"-"+(i+1));
"autoSave": "yes", }
"isDelComp": "yes", return tmp;
"delSameJob": "yes" }
}, var matrix = GEN.getMatrix({job:job});
"ats": { GEN.openStep({job : job,name:step});
"path": "C:/Users/Administrator/Desktop/Customer_1", for(var key in matrix){
"step": "cad", var val = matrix[key];
"ODB": { if(val.layer_type == "drill"){
"db": "genesis", var mergeTo = getDrl(val.name) // 要合并到的地方
"files": ["tgz"], mergeTo.forEach(function(layerName){
"arrStep": "stp", if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
"isMerge": "yes", GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
"jobNameRule": "(job)-a" }
}, if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){
"Gerber": { GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
"db": "genesis", newdrills.push(layerName.toLowerCase())
"files": ["drd", "drl", "phd", "phl"], }
"editFile": [{ GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
"filter": "drd", GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
"callback": "(function(){ return function(props){ })
var fs=props.fs,nowFile=props.nowFile,srcFiles=props.srcFiles;
var srcFile = srcFiles.filter(function(v){return v.name == nowFile.name})[0];
var str = fs.readFile(srcFile.path).replace(/:/g,'');
fs.writeFile(nowFile.path,str.match(/T\\d+|G\\d+|X\\d+\\.\\d+Y\\d+\\.\\d+/ig).join('\\n'));
}})()"
}],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Wheel",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
},
"gerberConfig": {
"drd": {
"data_type":"ascii",
"units":"mm",
"coordinates":"absolute",
"zeroes":"leading",
"nf1":3,
"nf2":0,
"decimal":"yes",
"separator":"nl",
"tool_units":"mm",
"nf_comp":0,
"multiplier":1,
"text_line_width":0.0024,
"signed_coords":"no",
"break_sr":"yes",
"drill_only":"no",
"merge_by_rule":"no",
"threshold":200,
"resolution":3
},
"phd": {
"data_type":"ascii",
"units":"mm",
"coordinates":"absolute",
"zeroes":"leading",
"nf1":3,
"nf2":4,
"decimal":"no",
"separator":"*",
"tool_units":"inch",
"nf_comp":0,
"multiplier":1,
"text_line_width":0.0024,
"signed_coords":"no",
"break_sr":"yes",
"drill_only":"no",
"merge_by_rule":"no",
"threshold":200,
"resolution":3
}
}
} }
} }
// 合并到maxDrill独立合并
GEN.createLayer({job:job,layer:"b1-"+maxDrill.value,conext:'board',type:'drill'});
GEN.workLayer({name:"b1-"+maxDrill.value,display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"b1-"+maxDrill.value});
GEN.affectedLayer({affected:"no",mode:"all"});
GEN.closeStep();
return this;
} }
*/
/*
{
"ats": {
"ODB": {
"db": "genesis",
"files": ["tgz"],
"arrStep": "stp",
"isMerge": "yes",
"jobNameRule": "(job)-a"
},
"path": "C:/Users/Administrator/Desktop/Customer_1",
"step": "cad",
"Gerber": {
"db": "genesis",
"files": ["drd", "drl", "phd", "phl"],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Wheel",
"phd": "Gerber274x",
"phl": "Ascii"
},
"editFile": [{
"filter": "drd",
"callback": "(function(){ return function(props){ var fs=props.fs,nowFile=props.nowFile,srcFiles=props.srcFiles; var srcFile = srcFiles.filter(function(v){return v.name == nowFile.name})[0]; var str = fs.readFile(srcFile.path).replace(/:/g,''); fs.writeFile(nowFile.path,str.match(/T\\d+|G\\d+|X\\d+\\.\\d+Y\\d+\\.\\d+/ig).join('\\n')); }})()"
}],
"gerberConfig": {
"drd": {
"nf1": 3,
"nf2": 0,
"units": "mm",
"zeroes": "leading",
"decimal": "yes",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"phd": {
"nf1": 3,
"nf2": 4,
"units": "mm",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
}
}
}
},
"def": {
"ODB": {
"db": "genesis",
"files": ["tgz"]
},
"step": "pcs",
"Gerber": {
"db": "genesis",
"files": ["drl", "art"],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Excellon2",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
}
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
}
}
*/
\ 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