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,374 @@ var config = { ...@@ -26,15 +66,374 @@ 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": 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, "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
}
}
}
}
],
"tl_name": [
{"orig_name" : "pasttop.art", "tl_name" : "past_top" },
{"orig_name" : "pleg.art", "tl_name" : "silk_top" },
{"orig_name" : "soldtop.art", "tl_name" : "sm_top" },
{"orig_name" : "top.art", "tl_name" : "top" },
{"orig_name" : "lay(\\d+)\\.art", "tl_name" : "l_($1)"},
{"orig_name" : "bottom.art", "tl_name" : "bottom" },
{"orig_name" : "soldbotm.art", "tl_name" : "sm_botm" },
{"orig_name" : "sleg.art", "tl_name" : "silk_bot" },
{"orig_name" : "pastbotm.art", "tl_name" : "past_botm" },
{"orig_name" : "multipack.art", "tl_name" : "array" },
{"orig_name" : "outline.art", "tl_name" : "outline" },
{"orig_name" : "fab.art", "tl_name" : "fab" },
{"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"
}
]
}
},
"data_format": [
{"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", "units": "mm",
"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": "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": "*", "separator": "*",
"threshold": 200, "threshold": 200,
"drill_only": "no", "drill_only": "no",
...@@ -47,26 +446,85 @@ var config = { ...@@ -47,26 +446,85 @@ 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": 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": "", // 文件正则 func "valid": function(props){
"type": "Gerber274", // 格式 odb gerber var file = props.file;
"format": "Gerber274_1" return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
}, },
{ {
"valid": "", // 文件正则 func "valid": function(props){
"type": "Excellon1", // 格式 odb gerber var file = props.file;
"format": "Excellon1_1", return /.+\.drl$/ig.test(file.name)
"rename": {} },
"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": [ "tlname": [
...@@ -84,11 +542,86 @@ var config = { ...@@ -84,11 +542,86 @@ var config = {
{"orig_name" : "bot-enig", "tlname" : "bot-enig" }, {"orig_name" : "bot-enig", "tlname" : "bot-enig" },
{"orig_name" : "fab_page2", "tlname" : "fab_page2" } {"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"
} }
]
}, },
"sort_rename": [ "New_data": {
{"tlname":"" , "newname":"" } // newname 里支持特殊变量 "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", var job = par.job.toLowerCase(); // 获取料号
"ODB": { var custCfg = config.customer[par.customer] // 获取客户配置
"db": "genesis", var step = custCfg.step.toLowerCase() // 获取pcs_step
"files": ["tgz"],
"arrStep": "stp", // 料号验证
"isMerge": "yes", if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
"jobNameRule": "(job)-a" if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
}, if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode != "develop"){ throw "the job check" }
"Gerber": { GEN.checkInout({job:job,mode:"out"});
"db": "genesis",
"files": ["drd", "drl", "phd", "phl"], // start martix_tl_name
"editFile": [{ var matrix = GEN.getMatrix({job:job})
"filter": "drd", var tl_name_matrix = tlNameMatrix({matrix:matrix,tl_name:custCfg.tl_name}) // 给matrix信息添加tl_name
"callback": "function(props){}" // tl_name_matrix.forEach(function(item){
}], // IKM.add({name:item.name, tl_name:item.tl_name})
"format": { // })
"art": "Gerber274x", // IKM.add("",1)
"drd": "Excellon1",
"drl": "Wheel", var format_cfg = config.data_format // 拿到数据标准化配置
"ipc": "IPC356",
"phd": "Gerber274x", // 排序和设属性
"phl": "Ascii" var ret = sortLayer({job:job, rule:format_cfg, matrix:tl_name_matrix})
} if(ret.err){throw err}
}, var after_sort_matrix = ret.sortNames
"autoSave": "yes", // 设置钻孔
"isDelComp": "yes", err = setDrill({job:job, matrix:after_sort_matrix})
"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} if(err){throw err}
} else {
var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0] // 改名
if(jobInfo.length==0){throw "file error"} err = reName({job:job, matrix:after_sort_matrix, cfg:format_cfg})
var err = importJob({name:job,db:odb.db,path:jobInfo.path},useCfg.delSameJob)
if(err){throw err} 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
}
if(!input_ok){throw "input failed"}
// end
if(/^yes$/ig.test(useCfg.isDelComp)){ // 删除comp层
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()
}
}
if(/^yes$/ig.test(useCfg.autoSave)){ // 自动保存
GEN.checkInout({job:job,mode:"out"})
GEN.saveJob({ job: job });
}
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
GUI.msg("end")
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]
}
} }
})
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 delSameJob(props){
function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则}
var job = props.job var job = props.job
var delSame = props.delSame var matrix = GEN.getMatrix({job:job})
if(GEN.isJobExists({job:job})){ var tl_matrix = props.matrix
if(/^yes$/ig.test(delSame)){ var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) } var matrixFirst = matrixName[0]; // 记录matrix中第一位
GEN.deleteJob({job:job}) 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 { } else {
return "job "+ job+ " exist" 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);
} }
} }
} });
function getPathInfo(props){ return flag;
var path = props.path }).map(function(v){return v.name})
var cfg = props.cfg miscName.forEach(function(n){
var res = {} if(matrix[n].context == 'board'){
res.files = fs.listDir(path) GEN.matrixLayerAttr({job:job,layer:n,context:'misc'})
res.fileSuffix = res.files.reduce(function(a,b){
if(b.isFile && a.indexOf(b.suffix)<0){
a.push(b.suffix)
} }
return a })
},[]) sortNames = sortNames.sort(function(a,b){
if(cfg.Gerber){ return a.value - b.value || a.value2 - b.value2
res.type = cfg.Gerber.files.reduce(function(a,b){ })
if(res.fileSuffix.indexOf(b) < 0){ // 排序
a = false if(sortNames.length){
if(sortNames[0].name !== matrixFirst) { // 如果第一位和matrix中第一位不同,先把第一位插入到最前面
GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst })
} }
return a sortNames.forEach(function(v,i,arr){
}, true)? "Gerber" : undefined if(i !== 0){
GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })
} }
if(cfg.ODB){ GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
res.type = cfg.ODB.files.reduce(function(a,b){ })
if(res.fileSuffix.indexOf(b) < 0){
a = false
} }
return a return {
}, true)? "ODB" : res.type sortNames:sortNames
} }
return res
} }
function getFileInfo(props){
var inputConfig = props.inputConfig, path = props.path, files = props.files function setDrill(props){ // 设置钻孔
var fileInfo = files.reduce(function(a,b){ var job = props.job
if(inputConfig.files.indexOf(b.suffix)>=0){ var matrix = props.matrix
a.push({ // 获取所有的钻孔层
name:b.name, var drillLayer =matrix.filter(function(v){
baseName: b.baseName, return v.attr.type == "drill" && v.attr.context == "board"
completeBaseName: b.completeBaseName, })
completeSuffix: b.completeSuffix, // 获取所有single层
path: b.path, var signalLayer =matrix.filter(function(v){
suffix: b.suffix return v.attr.type == "signal" && v.attr.context == "board"
}) })
}
return a
},[])
return fileInfo
}
function importJob(props,delSameJob){ var layerCount = GEN.getLayerCount({job:job})
var name = props.name // findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
if (GEN.isJobExists({ job: name })) { function findSignal(num){
if (/^yes$/ig.test(delSameJob)) { return signalLayer[Number(num-1)].name
if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); } }
GEN.deleteJob({ job: 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;
} }
else {
return "job "+name+" exist";
} }
})
} }
GEN.importJob(props); 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 mergeJob(props){ function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
var odb = props.odb
var job = props.job
var fileInfo = props.fileInfo
var arrJobName = odb.jobNameRule.replace("(job)", job)
var jobInfo = fileInfo.filter(function(v){return v.baseName == job})[0]
var arrJobInfo = fileInfo.filter(function(v){return v.baseName == arrJobName})[0]
if(!jobInfo){ return "file error" }
if(!arrJobInfo){ return "file error" }
var jobInfos = [jobInfo, arrJobInfo]
for(var i = 0;i<jobInfos.length;i++){
var err = importJob({name:jobInfos[i].baseName,db:odb.db,path:jobInfos[i].path},props.delSameJob)
if(err){return err}
}
// 合并操作
jobInfos.forEach(function(v){GEN.openJob({job:v.baseName})})
GEN.copyStep({
source_job:arrJobInfo.baseName,
source_name:odb.arrStep,
dest_job:jobInfo.baseName,
dest_name:odb.arrStep,
});
GEN.closeJob({ job: arrJobInfo.baseName });
GEN.deleteJob({ job: arrJobInfo.baseName });
}
function importGerber(props){
var fileInfo = props.fileInfo
var gerber = props.gerber
var job = props.job var job = props.job
var step = props.step var matrix = props.matrix
var gerberFiles = fileInfo.filter(function(file){return gerber.gerberConfig.hasOwnProperty(file.suffix)}) var cfg = props.cfg
var gerberInfo = gerberFiles.map(function(item){ matrix = matrix.filter(function(v){return v.name != v.new_name})
var gerberConfig = gerber.gerberConfig[item.suffix] || {} var rename_list = matrix.map(function(item){
var gerberItem = { var new_name;
layer: item.name.toLowerCase(), path: item.path, var tl_name = item.tl_name
format: gerber.format[item.suffix] || "Excellon2", var rule = item.rule
job:job,step:step if(rule === tl_name){
} new_name = item.new_name
for (var key in gerberConfig) { } else {
gerberItem[key] = gerberConfig[key] var reg = new RegExp(rule,"ig")
} var tmp = reg.exec(tl_name)
return gerberItem 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)
}) })
// 创建料号和step new_name = replaceTlName(new_name)
GEN.createJob({name:job,db:gerber.db}) function replaceTlName(name){
GEN.createStep({job:job,name:step}) var tmp = /(\([^)]*\))/ig.exec(name)
// 分析geber配置 if(!tmp){ return name }
GEN.COM("input_manual_reset") var param_arr = tmp[1].match(/\$\d+/ig)
gerberInfo.forEach(function(v){ var newname = tmp[1]
GEN.COM("input_manual_set",v) param_arr.forEach(function(v){
newname = newname.replace(new RegExp("\\"+v,"ig"), params[v])
}) })
GEN.COM("input_manual") newname = name.replace(tmp[1],eval(newname))
} return replaceTlName(newname)
/*
{
"def": {
"step": "pcs",
"ODB": {
"db": "genesis",
"files": ["tgz"]
},
"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"
},
"ats": {
"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(){ 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
} }
} }
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};
"ats": { function getDrl(str){
"ODB": { var num = /(\d+)-(\d+)/ig.exec(str); // 匹配出 num-num
"db": "genesis", var tmp = [];
"files": ["tgz"], for(var i = Number(num[1]);i<num[2];i++){
"arrStep": "stp", if(i == 1){
"isMerge": "yes", maxDrill = Number(num[2]) > maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
"jobNameRule": "(job)-a" }
}, tmp.push("L"+i+"-"+(i+1));
"path": "C:/Users/Administrator/Desktop/Customer_1", }
"step": "cad", return tmp;
"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
}
}
} }
}, var matrix = GEN.getMatrix({job:job});
"def": { GEN.openStep({job : job,name:step});
"ODB": { for(var key in matrix){
"db": "genesis", var val = matrix[key];
"files": ["tgz"] if(val.layer_type == "drill"){
}, var mergeTo = getDrl(val.name) // 要合并到的地方
"step": "pcs", mergeTo.forEach(function(layerName){
"Gerber": { if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
"db": "genesis", GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
"files": ["drl", "art"], }
"format": { if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){
"art": "Gerber274x", GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
"drd": "Excellon1", newdrills.push(layerName.toLowerCase())
"drl": "Excellon2", }
"ipc": "IPC356", GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
"phd": "Gerber274x", GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
"phl": "Ascii" })
} }
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
} }
// 合并到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;
} }
*/
\ 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