// 引入模块 包 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 cfg = JSON.parse(IKM.select_value({table:'pub_conf',field:'json_data',where:{path : 'cam/input_data'}})); // 读取配置文件 var useCfg = cfg.ats; // todo 选择使用哪个客户的配置 addDefaultCfg(cfg.def, useCfg) // 添加默认配置 /* useCfg 测试配置 "job": "1", "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 } 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'; } catch (error) { GUI.msg(error) return 'Error'; } function addDefaultCfg(def, use) { for (var key in def) { var val = def[key] if (typeof val == "string" && !use.hasOwnProperty(key)) { use[key] = val } else if (typeof val == "object" && use.hasOwnProperty(key)) { if (!use[key].hasOwnProperty("db")) { use[key].db = val.db } if (!use[key].hasOwnProperty("files")) { use[key].files = val.files } } 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 },[]) if(cfg.Gerber){ res.type = cfg.Gerber.files.reduce(function(a,b){ if(res.fileSuffix.indexOf(b) < 0){ a = false } return a }, true)? "Gerber" : undefined } if(cfg.ODB){ res.type = cfg.ODB.files.reduce(function(a,b){ if(res.fileSuffix.indexOf(b) < 0){ a = false } return a }, true)? "ODB" : res.type } 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 }) } return a },[]) return fileInfo } 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); } function mergeJob(props){ 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