/*
NAME:
DESCRIPTION: 锣带输出;
PARAMETER:
[
{
name : 'Outpath',
title : '导出路径',
type : 'LineEdit',
property : {tool_tip : '导出路径'},
},
{
name : 'step',
title : '工作step',
type : 'LineEdit',
property : {tool_tip : '工作step'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-09-01 Scott Sun
1.新版本
HELP:
功能简介
锣带输出
参数配置
step信息
注意事项
无
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>template");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
require("topsin.genmath")
var genMath = new GenMath();
var gui = new NewGUI(GUI);
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
Outpath:"C:/Users/Administrator/Desktop/jobs/demo",
auto_save: "No",
step:"step",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
var Step;
var rou_layer = [];
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
// 选择工作step
var workstep = getWorkStep()
if(workstep.length == 0){throw "未找到工作step"}
workstep.forEach(function(step){
Step = step;
GEN.openStep({job:Job,name:step});
GEN.clearLayers();
GEN.affectedLayer( {mode:'all',affected:'no'} );
GEN.COM( "sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
GEN.units( {type:'mm'} );
GEN.zoomHome();
var matrix = GEN.getMatrix({job:Job});
Object.keys(matrix).forEach(function(layer){
if(matrix[layer].context && matrix[layer].context == 'board' ){
if(matrix[layer].layer_type == 'rout'){
rou_layer.push(layer)
}
}
})
if(rou_layer.length) {
var info = confirm_gui({layers:rou_layer});
output_rou({job:Job,step:step,info:info});
input_layers({job:Job,step:step,info:info});
}
})
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
function NewGUI (gui) {
this.msgBox = function(props){ // title type content button
props = props || {}
return gui.msgBox(props.title || "title",props.type || "info",props.content || "content",props.button || ["ok", "cancel"]);
}
this.selectFromTreeview = gui.selectFromTreeview
this.selectFile = function(props){ // "choose something", "*", true, "file", "/home/abby/fast_io"
props = props || {}
return gui.selectFile(props.title || "choose something",props.filter || "*",props.multiple || false, "file","");
}
this.selectSingle = function(props) {
props = props || {}
return gui.selectSingle({
"title": props.title || "select",
"list": props.list || [],
"default": props["default"] || "",
"columns": props.columns || 2,
"gen":props.gen || GEN
});
}
this.selectMultiple = function(props) {
props = props || {}
return gui.selectMultiple({
"title": props.title || "select",
"list": props.list || [],
"defaultvalue": props["defaultvalue"] || [""],
"defaultsize": props["defaultsize"] || [200, 100],
"columns": props.columns || 2,
"gen":props.gen || GEN
});
}
this.selectFromTable = gui.selectFromTable
this.snapScreen = gui.snapScreen
this.imageViewer = gui.imageViewer
this.inputBox = gui.inputBox
this.showForm = gui.showForm
this.lockUnlockLayer = function(props){
props = props || {}
var tmp = {}
if (props.matrix) {
for (var key in props.matrix) {
var item = props.matrix[key]
tmp[key] = {
row : item.row,
name : item.name
}
}
}
return gui.lockUnlockLayer({
title: props.title || "lockUnlockLayer",
layermatrix:props.layermatrix || tmp
})
}
this.passwordBox = function(props){
props = props || {}
return gui.passwordBox({title:props.title || "password", password:props.password || "1212"})
}
this.selectJobLayer = function (props) {
props = props || {}
return gui.selectJobLayer({
layertypelist: props.layertypelist || [
{name: "all", display_name: "all", filter: function(x) { return x }},
{name: "signal", display_name: "signal", filter: function(x) { return x["layer_type"] === "signal"; }},
{name: "power_ground", display_name: "power_ground", filter: function(x) { return x["layer_type"] === "power_ground"; }},
{name: "mixed", display_name: "mixed", filter: function(x) { return x["layer_type"] === "mixed"; }},
{name: "solder_mask", display_name: "solder_mask", filter: function(x) { return x["layer_type"] === "solder_mask"; }},
{name: "silk_screen", display_name: "silk_screen", filter: function(x) { return x["layer_type"] === "silk_screen"; }},
{name: "solder_paste", display_name: "solder_paste", filter: function(x) { return x["layer_type"] === "solder_paste"; }},
{name: "drill", display_name: "drill", filter: function(x) { return x["layer_type"] === "drill"; }},
{name: "rout", display_name: "rout", filter: function(x) { return x["layer_type"] === "rout"; }},
{name: "document", display_name: "document", filter: function(x) { return x["layer_type"] === "document"; }}
],
//defaultlayertype: "ha",
joblist: props.joblist || [],
defaultJob: props.defaultJob || [], // select by default
steplist: props.steplist || [],
// defaultstep: "step3",
showstep: props.showstep || true,
selectmode: props.selectmode || "multiple", // single/multiple
layermatrix: props.layermatrix || { },
defaultlayer: props.defaultlayer || []
})
}
}
function getWorkStep(props){
var steplists = GEN.getStepList({job:job});
if(steplists.length == 0){return "该料号没有step"}
var steps_tmp = steplists.filter(function(name){
var reg = new RegExp(par.step, "ig")
return reg.test(name)
})
if(steplists.length == 0){return "根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!"}
var workstep = gui.selectMultiple({
title: "请先择工作step",
size:[200,100],
defaultsize:[200,100],
list: steplists.map(function(v){ var tmp = {}; tmp[v] = v ;return tmp}),
defaultvalue: steps_tmp,
columns: 1,
gen: GEN
})
if(workstep.length == 0 ) {return "没有先择step"}
return workstep
}
// rou输出
function output_rou(par) {
var info = par.info;
// var PL = GEN.getProfileLimits({job:Job,step:Step,units:'mm'});
var nc_set = 'zda';
var machine = 'sintai_excellon';
var layers = [];
for (var key in info.layer_info) {
layers.push(info.layer_info[key])
}
layers.forEach(function(layer){
if(/^yes$/i.test(layer.output_flag)){
if(GEN.getNcsetsList({job:Job,step:Step,layer:layer.layer_name}).indexOf(nc_set) >= 0) {
GEN.COM('ncrset_delete',{name:nc_set});
}
GEN.COM('ncrset_cur',{job:Job,step:Step,layer:layer.layer_name,ncset:nc_set});
GEN.COM('ncr_set_machine',{machine:machine,thickness:0});
GEN.COM('ncr_register',{angle:0,mirror:layer.is_mirror,xoff:0,yoff:0,version:1,xorigin:0,yorigin:0,xscale:layer.scale_x,yscale:layer.scale_y,xscale_o:0,yscale_o:0});
GEN.COM('ncr_cre_rout');
GEN.COM('ncr_ncf_export',{dir:info.output_path,name:layer.layer_name});
GEN.COM('ncrset_delete',{name:nc_set});
}
})
}
// 用户配置参数
function confirm_gui(par) {
var rows={},n=0;
// var cam = IKM.get_jobinfo({jobname:Job,jobid:JobId,jobcategory:'work',jobinfo:'cam_serial_number',withspec:1});
var folder = 'rou';
var path = PAR.Outpath+"/"+folder;
fs.mkdir(path)
par.layers.forEach(function(layer){
n++;
rows[n] = {};
rows[n].sequence = n;
rows[n].layer_name = layer;
rows[n].scale_x = 1;
rows[n].scale_y = 1;
rows[n].output_flag = 'Yes';
rows[n].is_mirror = 'no';
})
rows.output_path = path;
// var v_data = GUI.showForm({
// title:"Rou输出参数确认单",
// defaultsize:[520,500],
// items: [
// {
// type : 'title',
// property:{
// title:'输出料号和名称',
// },
// n_columns:2,
// },
// {
// type : 'title',
// property:{
// title:'参数确认',
// },
// n_columns:8,
// },
// {
// name : 'layer_info',
// label :'参数确认',
// label_position : 'no',
// "class" : 'TL::Gtk2::TableFormPanel',
// expand : 1,
// property : {
// tl_columns :[
// {
// column_name:'layer_name',
// label:'层别名称',
// width:100,
// type:'label',
// },
// {
// column_name:'scale_x',
// label:'涨缩值X',
// width:80,
// type:'number',
// must_field:1,
// },
// {
// column_name:'scale_y',
// label:'涨缩值Y',
// width:80,
// type:'number',
// must_field:1,
// },
// {
// column_name:'output_flag',
// label:'是否输出',
// width:80,
// type:'radio',
// property:{
// tl_columns : 2,
// tl_list : [{'Yes' : '是'}, {'No':'否'}],
// },
// },
// {
// column_name:'is_mirror',
// label:'是否镜像',
// width:80,
// type:'radio',
// property:{
// tl_columns : 2,
// tl_list : [{'yes' : '是'}, {'no':'否'}],
// },
// }
// ],
// tl_rows:rows,
// },
// set_value_func : function(par){
// var data = par.value;
// Object.keys(data).forEach(function(row_name){
// Object.keys(data[row_name]).forEach(function(col_name){
// par.widget.set_value(row_name,col_name,data[row_name][col_name]);
// })
// })
// },
// get_value_func : function(par){return par.widget.get_all_value();},
// },
// {
// type : 'title',
// property:{
// title:'输出设置',
// },
// n_columns:1,
// },
// {
// name : 'username',
// label : '输出者:',
// type : 'string',
// value:GEN.getUserName(),
// width:100,
// must_field:1,
// },
// {
// name : 'output_path',
// label : '输出路径:',
// type : 'string',
// value:path,
// width:100,
// must_field:1,
// property : {
// editable:0,
// },
// buttons : [
// {
// name:'btn1',label:'选择路径',stock:'gtk-add',
// command:function(par){
// var folder = GUI.select_file({title:'选择路径',type:'select-folder',defaultdir:PAR.Outpath});
// if(!folder){return}
// p.formpanel.set_value('output_path', folder);
// }
// },
// ],
// },
// ]
// });
return rows;
}
// 文件导入设置
function input_layers(par) {
var info = par.info;
var layers = [];
for (var key in info.layer_info) {
layers.push(info.layer_info[key])
}
layers.forEach(function(lyr){
if(/yes/i.test(lyr.output_flag)){
var name = info.output_path+'/'+lyr.layer_name;
var layer= lyr.layer_name.toLowerCase();
GEN.COM("input_manual_reset");
GEN.COM("input_manual_set,path="+name+",job="+par.job+",step="+par.step+
",format=Excellon2,data_type=ascii,units=mm,coordinates=absolute,zeroes=none,nf1=3,nf2=3,decimal=no,separator=nl,tool_units=mm,layer="+layer
+",wheel=,wheel_template=,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");
GEN.COM("input_manual,script_path=");
GEN.COM("matrix_layer_context,job="+par.job+",matrix=matrix,layer="+layer+",context=misc");
}
})
}