/* NAME: DESCRIPTION: 原稿拼底片; PARAMETER: [ { name : 'out_line', title : '外形层', type : 'LineEdit', property : {tool_tip : '定原稿拼片的step,如未设定,默认为org'}, }, { name : 'step', title : 'Org step', type : 'LineEdit', property : {tool_tip : '定原稿拼片的step,如未设定,默认为org'}, }, { name : 'job_suffix', title : '料号后缀', type : 'LineEdit', property : {tool_tip : '定原稿拼片的料号后缀,如未设定,默认为-org'}, }, { name : 'path', title : '输出路径', type : 'LineEdit', property : {tool_tip : '定原稿拼片的路径'}, }, { 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 = { out_line:"out", step:"step", job_suffix:"-org", path:"C:/Users/Administrator/Desktop/jobs/demo", auto_save: "No", 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 film_size = ['20x24','22x26','24x28']; var film_tol_number = 0; // 总的底片数量 var sold_mask_layer = []; // 阻焊层 var cust_code = "",serial=""; if(/^(?:[a-z0-9]{2})([a-z0-9]{2})(?:[a-z0-9])(?:[a-z0-9])(?:[a-z0-9])([a-z0-9]{3})(?:(?:[a-z0-9])(?:[a-z0-9])(?:[a-z0-9])|sys)(?:\-s)?/i.test(job)){ cust_code = RegExp.$1; serial = RegExp.$2; } par.film_name = cust_code + serial + '-org'; try { if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() } if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"} var gotoFlag = false; Job = job + par.job_suffix; // 检查拼片料号是否存在 var films=[],tmp_matrix={}; if (GEN.isJobExists({job:Job}) ){ var matrix = GEN.getMatrix({job:Job}); // my $customer_code = $IKM->select_value(-sql =>"select c.name from job as j left join public_customer as c on j.customer_id = c.id where j.id = $JOB_ID"); Object.keys(matrix).forEach(function(layer){ var tmp_reg = new RegExp(par.film_name) if( tmp_reg.test(layer) ){ films.push(layer); tmp_matrix[layer] = matrix[layer]; } }) if( films.length ){ if( GUI.confirm("料号"+Job+"在Genesis中已经存在,且已存在原稿拼片层,是否直接输出?",["yes", "no"], "question") == 'yes' ){ if( films.length > 1){ films = GUI.selectLayer({title:'请选择输出的原稿拼片层', layermatrix:tmp_matrix, layertype: "films", // default type of layertypelist layertypelist: [ {name: "films", display_name: "films", filter: function(x) { return films.indexOf(x["name"]) >= 0 ; }}, ], selectmode : 'multiple'}); // single if(films.length == 0){throw "canel"} } gotoFlag = true; } }else{ IKM.msg("料号"+Job+"在Genesis中已经存在, 请检查!"); return 'Cancel'; } }else{ GEN.copyJob({source_job:job,dest_job:Job,dest_database:GEN.getJobDbName({job:Job})}); } if(!gotoFlag){ var stepList = GEN.getStepList({job:job}) stepList = stepList.filter(function(step){ var reg = new RegExp(par.step,"ig") return reg.test(step) }) Step = stepList[0] if ( !GEN.isStepExists({job:Job,step:Step}) ){ IKM.msg(Step + "不存在,无法拼原稿!"); throw 'Cancel'; } // 获取sold_mask_layer sold_mask_layer = getLayer({layer_type:"solder_mask", context: "board"}) var matrix = GEN.getMatrix({job:Job}); var _default=[],films=[],tmp_matrix={}; for (var layer in matrix) { if ( GEN.isLayerEmpty( {job:Job,step:Step,layer:layer}) ){ delete matrix[layer]; continue; } var tmp_reg = new RegExp(par.film_name) if( tmp_reg.test(layer) ){ films.push(layer); tmp_matrix[layer] = matrix[layer]; delete matrix[layer]; continue; } if( matrix[layer].context == 'board' && matrix[layer].layer_type != 'drill' ){ _default.push(layer) } else{ if(layer == "map" || /^m[12]\-/.test(layer)){ _default.push(layer); } } } // if( films.length ){ if( GUI.confirm("已存在原稿拼片层,是否直接输出?" ["yes", "no"], "question") == 'yes' ){ if( films.length > 1){ films = GUI.selectLayer({title:'请选择输出的原稿拼片层', layermatrix:tmp_matrix, layertype: "films", // default type of layertypelist layertypelist: [ {name: "films", display_name: "films", filter: function(x) { return films.indexOf(x["name"]) >= 0 ; }}, ], selectmode : 'multiple'}); // single if(films.length == 0){throw "canel"} } gotoFlag = true; } } } if(!gotoFlag){ var tmplayers = GUI.selectLayer({ title:'请选择需拼片原稿层', layermatrix:matrix, layertype:"_default", layertypelist: [ { name: "_default", display_name: "_default", filter: function (x) { return _default.indexOf(x.name) >=0 } }, { name: "all", display_name: "all", filter: function (x) { return true } } ], selectmode:'multiple'}); if(tmplayers.length == 0){throw "cancel"} tmplayers = tmplayers.map(function(v){return v.name}) // 创建拼片的辅助层 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:'inch'} ); GEN.zoomHome(); if(!GEN.isLayerExists({job:Job,layer:par.out_line})){ IKM.msg(par.out_line + "层不存在!!"); throw 'Cancel'; } if(GEN.isLayerEmpty({job:Job,step:Step,layer:par.out_line})){ IKM.msg(par.out_line + "层为空无法创建profice!!"); throw 'Cancel'; } // 删除板外物 除map层外 2020-07-14 Super GEN.affectedLayer({affected:'yes',layer:par.out_line,clear_before:'yes'}); GEN.COM('sel_reverse'); if ( GEN.getSelectCount() > 1 ){ GEN.COM('sel_create_profile'); GEN.affectedLayer( {mode:'all',affected:'no'} ); }else{ GEN.COM('sel_reverse'); GEN.affectedLayer( {mode:'all',affected:'no'} ); IKM.msg(par.out_line + "层外形数量太少无法创建profice!!"); throw 'Cancel'; } tmplayers.forEach(function(layer){ if(!/^map$/.test(layer)){ GEN.affectedLayer({affected:'yes',layer:layer,clear_before:'no'}); } }) GEN.clipArea({layers_mode:'affected_layers',area:'profile',inout:'outside',margin:0,contour_cut:'yes'}); // 复制外形 GEN.workLayer({name:par.out_line,display_number:1,clear_before:'yes'}); tmplayers.forEach(function(layer){ if(!/^map$/.test(layer)){ GEN.affectedLayer({affected:'yes',layer:layer,clear_before:'no'}); } }) GEN.selCopyOther({dest:'affected_layers',invert:'no'}); GEN.clearLayers(); GEN.affectedLayer( {mode:'all',affected:'no'} ); // 创建阻焊负片层 var sold_mask_negative = []; if(sold_mask_layer.length > 0){ sold_mask_layer.forEach(function(layer){ var tmp_layer = layer+'+1'; sold_mask_negative.push(tmp_layer) var layer_limits = GEN.getLayerLimits({job:Job,step:Step,layer:layer,units:'inch'}); GEN.createLayer({job:Job,layer:tmp_layer,context:'misc',type:'document',delete_exists:'yes'}); GEN.affectedLayer({affected:'yes',layer:tmp_layer,clear_before:'yes'}); GEN.addRectangle({x1:Number(layer_limits.xmin)-0.1,y1:Number(layer_limits.ymin)-0.1,x2:Number(layer_limits.xmax)+0.1,y2:Number(layer_limits.ymax)+0.1}); GEN.affectedLayer({affected:'yes',layer:layer,clear_before:'yes'}); GEN.selCopyOther({target_layer:tmp_layer,invert:'yes'}); GEN.selContourize(); GEN.affectedLayer({mode:'all',affected:'no'}); }) } // 总的底片数量 film_tol_number = tmplayers.length*2 + sold_mask_layer.length; // 创建辅助层,返回实际需拼片的层 var tmp_layers = tmplayers; tmp_layers = tmp_layers.concat(sold_mask_negative) tmplayers = tmplayers.concat(tmp_layers); // my @tmp_layers2 = @tmplayers; create_tmp_layer({step:Step,layer:tmplayers,matrix:matrix}); var film_scheme = {}; var index = 1; film_size.forEach(function(filmsize){ var info = get_repeat_info({step:Step,layer:tmplayers,film_size:filmsize}); if(!film_scheme[index]){film_scheme[index] = {}} film_scheme[index].info = info; film_scheme[index].film_count = Object.keys(info).length; film_scheme[index].film_size = filmsize; index++ ; }) // 选出最优方案 var best_scheme_index; Object.keys(film_scheme).sort().forEach(function(index){ if(best_scheme_index){ if(film_scheme[index].film_count < film_scheme[best_scheme_index].film_count){ best_scheme_index = index; } }else{ best_scheme_index = index; } }) IKM.msg(3) film_repeat({step:Step,layer:tmplayers,info:film_scheme[best_scheme_index].info,film_size:film_scheme[best_scheme_index].film_size}); //画profile var tmp_fs = film_scheme[best_scheme_index].film_size.split("x") var film_width=tmp_fs[0],film_height = tmp_fs[1]; GEN.COM( 'profile_rect',{x1:0,y1:0,x2:film_width-0.005,y2:film_height-0.005}); //更改文字序列号 var change_layers = Object.keys(film_scheme[best_scheme_index].info).sort(function(a,b){ return film_scheme[best_scheme_index].info[a].num - film_scheme[best_scheme_index].info[b].num }) var number = 1; change_layers.forEach(function(layer){ GEN.affectedLayer({affected:'yes',mode:'single',layer:layer,clear_before:'yes'}); // GEN.selectByFilter(feat_types:'text',polarity:'positive',profile:'all'); var tmp_data = GEN.getFeatures({job:Job,step:Step,layer:layer,surface:0,options:'feat_index'}); // var tmp_data = GEN.getFeatures(job:Job,step:Step,layer:layer,options:'select'); var txt_data = tmp_data.filter(function(v){return v.type=="text"}) // $GUI->debug(-text:dump(@txt_data,'---',layer,$Step,$Job)); txt_data.forEach(function(data){ GEN.COM('sel_layer_feat',{operation:'select',layer:layer,index:data.index}); var txt = data.text.split("/") var new_text = number+'/'+txt[1]; GEN.COM( 'sel_change_txt',{ text:new_text, x_size:data.x_size, y_size:data.y_size, w_factor:data.w_factor, polarity:'no_change', mirror:'no', fontname:data.fontname }); number++; }) }) // 请检查拼片信息 var n = 1; var lastflag = true Object.keys(film_scheme[best_scheme_index].info).sort(function(a,b){ return film_scheme[best_scheme_index].info[a].num - film_scheme[best_scheme_index].info[b].num }).forEach(function(film){ if(lastflag){ if( n == 1 ){ GEN.workLayer({name:film,display_number:1,clear_before:'yes'}); } else{ GEN.displayLayer({name:film,number:n}); } n++; } if (n > 4){lastflag = false}; }) GEN.PAUSE('Please Check Layer'); } // if(films.length == 0){ films = Object.keys(film_scheme[best_scheme_index].info).sort(function(a,b){ return film_scheme[best_scheme_index].info[a].num - film_scheme[best_scheme_index].info[b].num }) } //my $film_size = $film_scheme->{$best_scheme_index}{film_size}; //删除多余step和层别 var steps = GEN.getStepList({job:Job}); steps.forEach(function(step){ if(step != Step){ GEN.matrixDeleteStep({job:Job,step:step}); } }) var matrix = GEN.getMatrix({job:Job}); Object.keys(matrix).forEach(function(layer){ var tmp_reg = new RegExp("^"+par.film_name) if(!tmp_reg.test(layer)){ _deleteLayer({layer:[layer]}); } }) GEN.checkInout({job:Job,mode:'out'}); // $GUI->debug(-text=>dump($PAR->{path})); GEN.saveJob({job:Job}); GEN.COM('export_job',{job:Job,path:par.path,mode:'tar_gzip',submode:'full',overwrite:'yes'}); // 保存 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 getLayer(props){ if(!props){return} if(!props.context){props.context = "board"} var matrix = GEN.getMatrix({job:job}) return Object.keys(matrix).reduce(function(a,b){ var info = matrix[b]; var ret = true; for (var key in props) { if(!Array.isArray(props[key])){props[key] = [props[key]]} if(info[key] && props[key].indexOf(info[key]) < 0){ ret = false } } if(ret){ a.push(props.res == "info"? info : b) } return a },[]) } function _deleteLayer(layers){ layers = Array.isArray(layers.layer) ? layers.layer : [layers.layer]; layers.forEach(function(layer){ if(GEN.isLayerExists({job:Job,layer:layer})){ GEN.deleteLayer({job:Job,layer:[layer]}) } }) } function create_tmp_layer(par){ var matrix = par.matrix; // 先清除原先存在的辅助层 Object.keys(matrix).forEach(function(layer){ if(/_$|_tl_angle$/ig.test(layer)){ GEN.deleteLayer({job:Job,layer:[layer],step:par.step}) } }) par.layer.forEach(function(layer){ var tmp_layer = layer+'_'; var tmp_layer_angle = layer+'_tl_angle'; GEN.copyLayer({source_job:Job,source_step:par.step,source_layer:layer,dest_layer:tmp_layer,invert:'no',mode:'replace'}); // 打散层上字串 GEN.affectedLayer({affected:'yes',layer:[tmp_layer],clear_before:'yes'}); GEN.selectByFilter({feat_types:'text',profile:'all'}); if ( GEN.getSelectCount() > 0 ){GEN.COM("sel_break")}; if(matrix[layer] && matrix[layer].tl_type == 'inner' && matrix[layer].polarity != 'negative' ){ var layer_limits = GEN.getLayerLimits({job:Job,step:par.step,layer:layer,units:'inch'}); var tmp = 'pos_to_neg_tl'; GEN.createLayer({job:Job,layer:tmp,context:'board',type:'document',delete_exists:'yes'}); GEN.affectedLayer({affected:'yes',layer:[tmp],clear_before:'yes'}); GEN.addRectangle({x1:Number(layer_limits.xmin)-0.1,y1:Number(layer_limits.ymin)-0.1,x2:Number(layer_limits.xmax)+0.1,y2:Number(layer_limits.ymax)+0.1}); GEN.affectedLayer({affected:'yes',layer:[tmp_layer],clear_before:'yes'}); GEN.selCopyOther({target_layer:tmp,invert:'yes'}); GEN.copyLayer({source_job:Job,source_step:par.step,source_layer:tmp,dest_layer:tmp_layer,invert:'no',mode:'replace'}); GEN.deleteLayer({job:Job,layer:[tmp],step:par.step}); } // $GUI->debug(dump(matrix[layer].tl_type)); GEN.copyLayer({source_job:Job,source_step:par.step,source_layer:tmp_layer,dest_layer:tmp_layer_angle,invert:'no',mode:'replace'}); // GEN.affectedLayer({affected:'yes',layer:[tmp_layer],clear_before:'yes'}); var layer_limits = GEN.getLayerLimits({job:Job,step:par.step,layer:tmp_layer,units:'inch'}); GEN.selMove({dx:0-layer_limits.xmin+0.1,dy:0-layer_limits.ymin+0.1}); // 制作旋转辅助层 GEN.affectedLayer({affected:'yes',layer:[tmp_layer_angle],clear_before:'yes'}); GEN.selTransform({mode:'anchor',oper:'rotate',x_anchor:0,y_anchor:0,angle:90}); layer_limits = GEN.getLayerLimits({job:Job,step:par.step,layer:tmp_layer_angle,units:'inch'}); GEN.selMove({dx:0-layer_limits.xmin+0.1,dy:0-layer_limits.ymin+0.1}); // 添加文字标识 [tmp_layer,tmp_layer_angle].forEach(function(txt_data){ GEN.affectedLayer({affected:'yes',layer:txt_data,clear_before:'yes'}); var txt = '1/'+film_tol_number+' '+Job.toUpperCase()+' '+layer.toUpperCase(); var lay_limt = GEN.getLayerLimits({job:Job,step:par.step,layer:txt_data,units:'inch'}); Add_Text({x:lay_limt.xmin-0,y:lay_limt.ymin - 0.18,txt:txt,angle:0}); // GEN.createLayer(job:Job,layer:$txt_data.'+bak',context:'misc',type:'document',delete_exists:'yes'); // GEN.selCopyOther(target_layer:$txt_data.'+bak',invert:'no'); }) }) } function get_repeat_info(par){ // 判断不旋转 var info1 = {}; var film_size = par.film_size; var tmp_film_size = film_size.split("x") var film_width = tmp_film_size[0],film_height = tmp_film_size[1]; var film_org = PAR.film_name+'-'+film_size; var film_name=film_org,film_num=0,film_status="old"; var first_area,last_area={},xstart={},ystart;//第一张底片的范围/上一张底片的范围 par.layer.forEach(function(layer){ var tmp_layer = layer+'_'; film_status = last_area.xmin ? 'old' : 'new' ; var layer_limits = GEN.getLayerLimits({job:Job,step:par.step,layer:tmp_layer,units:'inch'}); layer_limits.xsize = layer_limits.xsize - 0; layer_limits.ysize = layer_limits.ysize - 0; layer_limits.xmin = layer_limits.xmin - 0; layer_limits.ymin = layer_limits.ymin - 0; layer_limits.xmax = layer_limits.xmax - 0; layer_limits.ymax = layer_limits.ymax - 0; var tol_x = (layer_limits.xsize > layer_limits.ysize) ? 0.3 : 0.3; var tol_y = (layer_limits.xsize > layer_limits.ysize) ? 0.3 : 0.3; // 判断拼入后是否会超出范围 if( layer_limits.xsize > film_width && layer_limits.ysize > film_height ){ // xy都超出范围,一片一拼 film_status = 'new'; } else if( layer_limits.xsize > film_width ){ film_status = 'new' ;//if ( ($last_area->{ymax}+ layer_limits.ysize) > $film_height ); } else if( layer_limits.ysize > film_height ){ film_status = 'new' ;//if ( ($last_area->{xmax}+ layer_limits.xsize) > film_width ); } else{ if ( (last_area.ymax+ layer_limits.ysize) > film_height && (last_area.xmax+ layer_limits.xsize) > film_width ){ film_status = 'new' }; } // 新底片的准备工作 if( film_status == 'new' ){ film_name = film_org+'-'+film_num; if(!info1[film_name]){info1[film_name] = {}} if(!info1[film_name].layers){info1[film_name].layers = []} if(!info1[film_name][layer]){info1[film_name][layer] ={shift:{}}} info1[film_name].layers.push(layer) info1[film_name].num = film_num; info1[film_name].type = 'no_angle'; info1[film_name][layer].shift.x = 0; info1[film_name][layer].shift.y = 0; xstart.status = 1; xstart.shifty = info1[film_name][layer].shift.y; first_area = { xmin: layer_limits.xmin, ymin: layer_limits.ymin, xmax: layer_limits.xmax + tol_x, ymax: layer_limits.ymax + tol_y, xsize: layer_limits.xsize + tol_x, ysize: layer_limits.ysize + tol_y }; last_area = first_area; film_num++; }else{ // Y方向添加 if ( (last_area.xsize+ layer_limits.xsize+tol_x) > film_width ){ //print dump($last_area->{xsize},'--',layer_limits.xsize,'--',film_width),"\n"; //print dump(@{$info{$film_name}{layers}}),"\n"; //GEN.PAUSE('tttt++'.$layer); if(!info1[film_name]){info1[film_name] = {}} if(!info1[film_name].layers){info1[film_name].layers = []} if(!info1[film_name][layer]){info1[film_name][layer] ={shift:{}}} info1[film_name].layers.push(layer); info1[film_name][layer].shift.x = 0; info1[film_name][layer].shift.y = last_area.ymax-layer_limits.ymin; xstart.status = 1; xstart.shifty = info1[film_name][layer].shift.y; //$ystart->{status} = 0;$xstart->{shiftx} = undef; last_area = { xmin: layer_limits.xmin, ymin: layer_limits.ymin + info1[film_name][layer].shift.y, xmax: layer_limits.xmax + tol_x, ymax: info1[film_name][layer].shift.y + layer_limits.ymax + tol_y, xsize: layer_limits.xsize + tol_x, ysize: layer_limits.ysize + last_area.ysize + tol_y }; } // X方向添加 else{ if(!info1[film_name]){info1[film_name] = {}} if(!info1[film_name].layers){info1[film_name].layers = []} if(!info1[film_name][layer]){info1[film_name][layer] ={shift:{}}} info1[film_name].layers.push(layer); info1[film_name][layer].shift.x = last_area.xmax-layer_limits.xmin; info1[film_name][layer].shift.y = xstart.status ? xstart.shifty : last_area.ymax-last_area.xmin; //print dump($info{$film_name}{$layer}{shift}{x},'-----',$info{$film_name}{$layer}{shift}{y}),"\n"; //GEN.PAUSE('ttt++'.$layer); xstart.status = 1; xstart.shifty = info1[film_name][layer].shift.y; var high = (layer_limits.ymax+info1[film_name][layer].shift.y-0+tol_y) > last_area.ymax ? layer_limits.ymax+info1[film_name][layer].shift.y-0+tol_y : last_area.ymax; //$ystart->{status} = 1;$ystart->{shiftx} = undef; last_area = { xmin: layer_limits.xmin + info1[film_name][layer].shift.x, ymin: layer_limits.ymin + info1[film_name][layer].shift.y, xmax: layer_limits.xmax + info1[film_name][layer].shift.x + tol_x, ymax: high, xsize: layer_limits.xsize + last_area.xsize + tol_x, ysize: layer_limits.ysize + tol_y }; } } }) // 判断旋转90度 var info2 = {}; film_org = PAR.film_name+'-'+film_size; film_name = film_org,film_num=0,film_status="old"; first_area={},last_area={},xstart={},ystart={};//第一张底片的范围/上一张底片的范围 par.layer.forEach(function(layer){ var tmp_layer = layer+'_tl_angle'; film_status = last_area.xmin ? 'old' : 'new' ; var layer_limits = GEN.getLayerLimits({job:Job,step:par.step,layer:tmp_layer,units:'inch'}); layer_limits.xsize = layer_limits.xsize - 0; layer_limits.ysize = layer_limits.ysize - 0; layer_limits.xmin = layer_limits.xmin - 0; layer_limits.ymin = layer_limits.ymin - 0; layer_limits.xmax = layer_limits.xmax - 0; layer_limits.ymax = layer_limits.ymax - 0; var tol_x = (layer_limits.xsize > layer_limits.ysize) ? 0.3 : 0.3; var tol_y = (layer_limits.xsize > layer_limits.ysize) ? 0.3 : 0.3; //判断拼入后是否会超出范围 if( layer_limits.xsize > film_width && layer_limits.ysize > film_height ){ //xy都超出范围,一片一拼 film_status = 'new'; } else if( layer_limits.xsize > film_width ){ film_status = 'new' ;//if ( ($last_area->{ymax}+ layer_limits.ysize) > $film_height ); } else if( layer_limits.ysize > film_height ){ film_status = 'new' ;//if ( ($last_area->{xmax}+ layer_limits.xsize) > film_width ); } else{ if ( (last_area.ymax+ layer_limits.ysize) > film_height && (last_area.xmax+ layer_limits.xsize) > film_width ){ film_status = 'new' }; } //新底片的准备工作 if( film_status == 'new' ){ film_name = film_org+'-'+film_num; if(!info2[film_name]){info2[film_name] = {}} if(!info2[film_name].layers){info2[film_name].layers = []} if(!info2[film_name][layer]){info2[film_name][layer] ={shift:{}}} info2[film_name].layers.push(layer) info2[film_name].num = film_num; info2[film_name].type = 'angle'; info2[film_name][layer].shift.x = 0; info2[film_name][layer].shift.y = 0; xstart.status = 1; xstart.shifty = info2[film_name][layer].shift.y; first_area = { xmin: layer_limits.xmin, ymin: layer_limits.ymin, xmax: layer_limits.xmax + tol_x, ymax: layer_limits.ymax + tol_y, xsize: layer_limits.xsize + tol_x, ysize: layer_limits.ysize + tol_y }; last_area = first_area; film_num++; }else{ //Y方向添加 if ( (last_area.xsize+ layer_limits.xsize+tol_x) > film_width ){ //print dump($last_area->{xsize},'--',layer_limits.xsize,'--',film_width),"\n"; //print dump(@{$info{$film_name}{layers}}),"\n"; //GEN.PAUSE('tttt++'.$layer); if(!info2[film_name]){info2[film_name] = {}} if(!info2[film_name].layers){info2[film_name].layers = []} if(!info2[film_name][layer]){info2[film_name][layer] ={shift:{}}} info2[film_name].layers.push(layer); info2[film_name][layer].shift.x = 0; info2[film_name][layer].shift.y = last_area.ymax-layer_limits.ymin; xstart.status = 1; xstart.shifty = info2[film_name][layer].shift.y; //$ystart->{status} = 0;$xstart->{shiftx} = undef; last_area = { xmin: layer_limits.xmin, ymin: layer_limits.ymin + info2[film_name][layer].shift.y, xmax: layer_limits.xmax + tol_x, ymax: info2[film_name][layer].shift.y + layer_limits.ymax + tol_y, xsize: layer_limits.xsize + tol_x, ysize: layer_limits.ysize + last_area.ysize + tol_y }; } //#X方向添加 else{ if(!info2[film_name]){info2[film_name] = {}} if(!info2[film_name].layers){info2[film_name].layers = []} if(!info2[film_name][layer]){info2[film_name][layer] ={shift:{}}} info2[film_name].layers.push(layer); info2[film_name][layer].shift.x = last_area.xmax-layer_limits.xmin; info2[film_name][layer].shift.y = xstart.status ? xstart.shifty : last_area.ymax-last_area.xmin; //print dump($info{$film_name}{$layer}{shift}{x},'-----',$info{$film_name}{$layer}{shift}{y}),"\n"; //GEN.PAUSE('ttt++'.$layer); xstart.status = 1; xstart.shifty = info2[film_name][layer].shift.y; var high = (layer_limits.ymax+info2[film_name][layer].shift.y-0+tol_y) > last_area.ymax ? layer_limits.ymax+info2[film_name][layer].shift.y-0+tol_y : last_area.ymax; //$ystart->{status} = 1;$ystart->{shiftx} = undef; last_area = { xmin: layer_limits.xmin + info2[film_name][layer].shift.x, ymin: layer_limits.ymin + info2[film_name][layer].shift.y, xmax: layer_limits.xmax + info2[film_name][layer].shift.x + tol_x, ymax: high, xsize: layer_limits.xsize + last_area.xsize + tol_x, ysize: layer_limits.ysize + tol_y }; } } }) // if( Object.keys(info2).length < Object.keys(info1).length){ return info2; } else{ return info1; } } function film_repeat(par){ var film_size = par.film_size; var tmp_film_size = film_size.split("x") var film_width = tmp_film_size[0]; var film_height = tmp_film_size[1]; var info = par.info; Object.keys(info).sort(function(a,b){return info[a].num - info[b].num}).forEach(function(film){ if(info[film].layers){ GEN.createLayer({job:Job,layer:film,conext:'misc',type:'document',delete_exists:'yes'}); GEN.affectedLayer({affected:'yes',layer:[film],clear_before:'yes'}); // my $all = scalar(@{$info{$film}{layers}}); // $GUI->debug(dump($film, $info{$film}{layers})); var n = 1; info[film].layers.forEach(function(layer){ var tmp_layer = info[film].type == 'no_angle' ? layer+'_' : layer+'_tl_angle'; GEN.affectedLayer({affected:'yes',layer:[tmp_layer],clear_before:'yes'}); GEN.selMove({dx:info[film][layer].shift.x,dy:info[film][layer].shift.y}); GEN.copyLayer({source_job:Job,source_step:par.step,source_layer:tmp_layer,dest_layer:film,invert:'no',mode:'append'}); GEN.selMove({dx:-info[film][layer].shift.x,dy:-info[film][layer].shift.y}); // GEN.deleteLayer(job:Job,layer:[$layer.'_',$layer.'_tl_angle'],step:par.step); n++; }) GEN.affectedLayer({affected:'yes',layer:[film],clear_before:'yes'}); // 移动居中 var layer_limits = GEN.getLayerLimits({job:Job,step:Step,layer:film,units:'inch'}); layer_limits.xc = layer_limits.xsize/2-Math.abs(layer_limits.xmin); layer_limits.yc = layer_limits.ysize/2-Math.abs(layer_limits.ymin); GEN.selMove({dx:film_width/2-layer_limits.xc,dy:film_height/2-layer_limits.yc}); // GEN.addRectangle({x1:0,y1:0,x2:film_width-0.005,y2:film_height-0.005,type:'line',symbol:'r5'}); } }) } // =head // 增加文字 Add_Text(x=>,y=>,txt=>,angle=>) // =cut function Add_Text(par){ GEN.COM('add_text',{ attributes:'no', type:'string', x:par.x, y:par.y, text:par.txt, x_size:0.15, y_size:0.15, w_factor:1.6666666269, polarity:'positive', angle:par.angle, mirror:'no', fontname:'simple', ver:1 }) }