// 引入模块 包 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; var drill_toll_manage = {} try { var job = "sj"; if(GEN.isJobExists({job:job})){ GEN.closeJob({job:job}) GEN.deleteJob({job:job}) } var config = { format: { "Gerber274x_1": { "nf1": 5, "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": 2, "nf2": 3, "units": "inch", "zeroes": "none", "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 } }, odb: [{ vaild: function(item){ return /\.tgz$/ig.test(item.name) // 以.tgz结尾的 } }], gerber: [ { vaild: function(item){ return /\.art$/ig.test(item.name) // 以.art结尾的 }, type: "Gerber274x", format: "Gerber274x_1" }, { vaild: function(item){ return /\.drl$/ig.test(item.name) // 以.drl结尾的 }, type: "Excellon2", format: "Excellon2_1" } ] } var path = "C:/Users/Administrator/Desktop/sj(1)" var inputInfo = getJobInfo({path:path, job:job,config:config}) if(/gerber/ig.test(inputInfo.type)){ inputInfo.data.forEach(function(file){ if(/\.drl$/ig.test(file.name)){ var backUpName = file.name+".backup" // 备份 fs.copyFile(file.path,file.dir+"/"+backUpName) // 读取 var data = fs.readFile(file.path) data = data.split("\n") var head = getHead(data) var body = data // 解析head var headData = head.filter(function(v){ return /Holesize.+Tolerance.+PLATED/ig.test(v) }) headData.map(function(v){ var res = { holesize: {}, tolerance: {}, attr: "", unit: "", quantity: 0 } var holesize_tmp = /(Holesize.+)Tolerance/.exec(v)[1]; holesize_tmp = holesize_tmp.split("=") res.holesize.key = holesize_tmp[0].trim() res.holesize.value = holesize_tmp[1].trim() var Tolerance_tmp = /(Tolerance.{23})/.exec(v)[1]; Tolerance_tmp = Tolerance_tmp.split("=")[1].split("/") res.tolerance.top = Tolerance_tmp[0].trim() res.tolerance.bot = Tolerance_tmp[1].trim() res.attr = /NON_PLATED/ig.test(v) ? "non_plated" : "plated" res.unit = /MILS/ig.test(v) ? "inch" : "mm" res.quantity = parseInt(v.split("=").pop()) if(!drill_toll_manage.hasOwnProperty(file.name)){ drill_toll_manage[file.name] = {} } drill_toll_manage[file.name][/(\d+)/ig.exec(res.holesize.key)[1]] = res }) // 给body添加刀 var count = 0; body = body.filter(function(v){ return !(/T\d+/ig.test(v)) }) body.forEach(function(v, i){ if(/^%$|^M00/ig.test(v)){ var k = "T" + getK(++count) body[i] = v + "\n" + k } }) // 写入文件 var resStr = head.join("\n") + "\n" + body.join("\n") fs.writeFile(file.path,resStr) } }) importGerber({job:job,step:"pcs",db:"genesis",data:inputInfo.data}) // 导入后 修改 tool manager var stepList = GEN.getStepList({job:job}) var matrix = GEN.getMatrix({job:job}) var drill_layers = Object.keys(matrix).filter(function(v){return matrix[v].layer_type=="drill"}) stepList.forEach(function(step){ GEN.openStep({job:job,name:step}) drill_layers.forEach(function(layer){ var drill_tool_manage_info = drill_toll_manage[layer] var drill_tool_keys = Object.keys(drill_tool_manage_info).sort(function(a,b){return a-b}) GEN.COM("tools_tab_reset") drill_tool_keys.forEach(function(key){ var val = drill_tool_manage_info[key] GEN.COM("tools_tab_add", { num: key, type: /plated/ig.test(val.attr) ? "plate" : "nplate", min_tol: Number(val.tolerance.top), max_tol: Number(val.tolerance.bot), finish_size: Number(val.holesize.value), drill_size: Number(val.holesize.value) }) }) GEN.COM("tools_set",{layer:layer,thickness:0,user_params:1,slots:"by_length"}) }) GEN.closeStep() }) } return "Done" } catch (e) { IKM.msg(e) return "Error" } function getJobInfo(props){ var path = props.path var config = props.config var job = props.job var files = fs.listDir(path) files = files.filter(function(v){return v.isFile}) // 过滤出文件 // 先判断是不是odb var odbFiles = files.filter(function(file){ // 拿到odb文件 return config.odb.reduce(function(a,b){ if(b.vaild(file)){ a = true } return a }, false) }) if(odbFiles.length){ return { type: "odb", data: odbFiles[0] } } var gerberFiles = files.filter(function(file){ // 拿到odb文件 return config.gerber.reduce(function(a,b){ if(b.vaild(file)){ file.gerber = config.format[b.format]; file.type = b.type; a = true } return a }, false) }) if(gerberFiles.length){ return { type: "gerber", data: gerberFiles } } return "none" } function importGerber(props){ // job db step var job = props.job var step = props.step var files = props.data GEN.createJob({name:job,db:props.db}) GEN.createStep({job:job,name:props.step}) var gerberInfo = files.map(function(item){ var gerberCfg = JSON.parse(JSON.stringify(item.gerber)); gerberCfg.layer = item.name.toLowerCase() gerberCfg.path = item.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") } function getHead(arr,head){ head = head || []; if(arr[0] != "%"){ head.push(arr.shift()) return getHead(arr,head) } else { return head } } function getK(count){ return count < 10 ? "0" + String(count) : String(count) }