/* NAME: DESCRIPTION: 导入gerber数据 PARAMETER: [ { name : 'customer', title : 'CUSTOMER 名', type : 'LineEdit', property : {tool_tip : '客户名称'} }, { name : 'job_name', title : '料号名', type : 'LineEdit', property : {tool_tip : '料号名'} }, { name : 'path', title : '资料路径', type : 'LineEdit', property : {tool_tip : '客户资料所在路径'} } ] VERSION_HISTORY: V1.00 2020 3-30 Scott HELP:

功能简介

导入gerber数据


参数配置

导入gerber数据的规则

注意事项

● 无


*/ // 引入模块 包 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 par = $.par; // !!! tmp par = { customer: "ats", job_name: "1", path: "C:/Users/Alan/Desktop/Customer_1" } var parParams = ["customer", "job_name", "path"]; // par应该有的属性 var isParExist = parParams.reduce(function (a, b) { if (!par.hasOwnProperty(b)) { a = false; } else if (par[b] == "") { switch (b) { case "job_name": par.job_name = Job; break; } } return a; }, true); if(!isParExist){throw "par error"} // 如果par没有parParams里的属性 就退出 var cfg = JSON.parse(IKM.select_value({table:'pub_conf',field:'json_data',where:{path : 'cam/input_data'}})); // 读取配置文件 var customer = par.customer.split("_")[0].toLowerCase() var useCfg = cfg[customer]; addDefaultCfg(cfg.def, useCfg) // 添加默认配置 if(customer != par.customer.toLowerCase()){ var cfgType = cfg[par.customer.toLowerCase()] if(cfgType){ changeCfg(useCfg, cfgType) } } var job = par.job_name, path = par.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}) return 'Done'; } catch (error) { IKM.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] } } } if (key == "ODB" && !use.hasOwnProperty(key)){ use.ODB = val } } } function changeCfg(useCfg,cfgType){ for(var key in cfgType){ var value = cfgType[key] if(key == "Gerber"){ changeCfg(useCfg.Gerber, cfgType.Gerber) } else { useCfg[key] = value } } } 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 = true } return a }, false)? "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