Commit f4212ebf authored by Scott Sun's avatar Scott Sun

s

parent 046d9396
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name:"step",
title:"step名称",
type:"LineEdit",
property:{tool_tip:"step名称,默认orig"}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-06-10 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 立碑效应 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>li bei xiao yin start");
// 引入模块 包
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;
Job = Job.toLowerCase()
var job = Job
var JobId = $.job_id;
var db = $.db || {}
var PAR = {}
if ($.par) {
PAR = $.par
} else if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
var par = PAR;
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 }
});
}
}
var Status = 'ok';
var resultData = [];
var debug = true;
var default_par = { // par默认参数?
step:"orig",
auto_save: "no"
}
for(var key in default_par){ // 设置默认属性
if (!par.hasOwnProperty(key) || par[key] == ""){
par[key] = default_par[key]
}
}
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.confirm = function(props) {
props = props || {}
return gui.confirm(props.content || "content",props.button || ["yes", "no"], props.type || "question");
}
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["default"] || [""],
"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.selectLayer = function(props){
props = props || {}
return gui.selectLayer({
title: props.title || "请选择层",
filter: props.filter || ".*", // regular expression
selectmode: props.selectmode || "multiple", // single, multiple
context: props.context || "all", // all, board, misc
layertype: props.layertype || "signal", // default type of layertypelist
defaultsize: props.defaultsize || [600, 400], // window size
layermatrix: props.layermatrix || props.matrix,
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"; }}
],
gen: props.GEN || GEN
})
}
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 || []
})
}
}
try {
var gui = new NewGUI(GUI)
var matrix = GEN.getMatrix({job:job})
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";
}
...@@ -9,6 +9,82 @@ PARAMETER: ...@@ -9,6 +9,82 @@ PARAMETER:
type : 'LineEdit', type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'}, property : {tool_tip : '目标step,默认是orig'},
}, },
{
name : 'outline',
title : 'outline',
type : 'LineEdit',
property : {tool_tip : '目标outline,默认是ol'},
},
{
name : 'units',
title : '单位',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'inch',text:'INCH'},
{name:'mm',text:'MM'},
],
tool_tip:'工作单位,未设定,默认为INCH'
},
pack : {row:1,column:1},
},
{
name : 'cover_layer_suffix',
title : '文字套层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_sm',
title : '文字距离阻焊',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_smd',
title : '文字距离SMD',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_bga',
title : '文字距离bga',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'silk_suffix',
title : '分离的文字层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'text_height',
title : '文字最大高度',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'bk_suffix',
title : '备份层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'select_lyr',
title : '选择层别',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'未设定,默认为Yes'
},
pack : {row:1,column:1},
},
{ {
name : 'auto_save', name : 'auto_save',
title : '自动保存', title : '自动保存',
...@@ -42,7 +118,7 @@ PARAMETER: ...@@ -42,7 +118,7 @@ PARAMETER:
*/ */
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
console.log("==============================>template"); console.log("=============================:template");
// 引入模块 包 // 引入模块 包
var $ = require('topcam.scriptfunc').argv(); var $ = require('topcam.scriptfunc').argv();
var fs = require('fs'); var fs = require('fs');
...@@ -70,11 +146,26 @@ var Status = 'ok'; ...@@ -70,11 +146,26 @@ var Status = 'ok';
var resultData = []; var resultData = [];
var par = PAR; var par = PAR;
var default_par = { var default_par = {
step: "orig", units:"mm",
auto_save: "No", cover_layer_suffix: "_cover",
ss_to_sm: 10, // 文字距离阻焊
ss_to_smd: 10, // 文字距离SMD
ss_to_bga: 10, // 文字距离bga
text_height: 1, // 文字最大高度
bk_suffix: "_bk", // 备份层后缀
silk_suffix: "_font", // 分离的文字层后缀
select_lyr: "no",
step: "unit",
auto_save: "No",
outline: "ol"
} }
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }} for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job; var job = Job;
var outline = par.outline
var gui = new NewGUI(GUI);
if(!par.outline_size){
par.outline_size = par.units == 'inch' ? 16 : 200;
}
try { try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() } if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"} if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
...@@ -82,17 +173,11 @@ try { ...@@ -82,17 +173,11 @@ try {
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } } if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
var err = createCoverLayer() // 创建套层
if (err) {throw err}
IKM.msg(123)
var err = ssFrameSeparate() // 分离文字和文字框
if (err) {throw err}
...@@ -114,4 +199,565 @@ try { ...@@ -114,4 +199,565 @@ try {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error'; IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]}); resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error"; return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
// 创建套层
function createCoverLayer (props){
// 1. step过滤
var workstep = getWorkStep()
if(!Array.isArray(workstep)){throw "工作step错误"}
// 2.过滤工作层
var work_layer = getLayer({layer_type:"silk_screen", context: "board"})
if(/yes/ig.test(par.select_lyr)){
var matrix = GEN.getMatrix({job:job});
var layers = Object.keys(matrix).map(function(key){
var tmp ={};
tmp[key] = key;
return tmp
})
work_layer = gui.selectMultiple({title: "请先择工作层",list: layers,defaultvalue: work_layer,columns: 4,gen: GEN})
}
if(work_layer.length == 0 ) {return "没有先择layer"}
// 其他参数
var info = gui.showForm({
title : '请手动匹配以下信息',
showcheck : 1,gen:GEN,
defaultsize:[500,250],
ui: {
type: 'ScrollArea',
property: { widget_resizable: true, frame_shape: 'NoFrame', align: 'Top' },
child: {
type: 'VBoxLayout',
property: { margin: 2, spacing: 5, align: 'Top' },
pack: { stretch: 0 },
child:[{
type: "FormGridLayout",
property: { columns: 1, label_alignment: 'Top | Right', margin: 10, spacing: 20 },
pack: { stretch: 0 },
child:[{
name : 'ss_to_sm',
pack: { label: '文字距离阻焊(单边)' },
type : 'LineEdit',
units:par.units == 'inch' ? 'mil' : 'um',
setter: function(obj){ obj.setText() },
property: { enabled: true, value:par.ss_to_sm }
},
{
name : 'ss_to_smd',
pack: { label: '文字距离SMD(单边)' },
type : 'LineEdit',
setter: function(obj){ obj.setText() },
units:par.units == 'inch' ? 'mil' : 'um',
property: { value:par.ss_to_smd,enabled: true }
},
{
name : 'ss_to_bga',
pack: { label: '文字距离BGA(单边)' },
setter: function(obj){ obj.setText() },
type : 'LineEdit',
value:par.ss_to_bga,
units:par.units == 'inch' ? 'mil' : 'um',
property: {value:par.ss_to_smd, enabled: true }
},
{
type: "stretch"
}]
}]
}
}
});
if(!info){throw "未填写参数"}
info = JSON.parse(JSON.stringify(info))
var matrix = GEN.getMatrix({job:job})
workstep.forEach(function(step){
GEN.openStep({job:job,name:step});
GEN.clearLayers();
GEN.affectedLayer({ mode:'all',affected:'no' });
GEN.units({ type:par.units} );
GEN.zoomHome();
work_layer.forEach(function(layer){
var cover_lyr = layer + par.cover_layer_suffix ;
var sm,outer ;
if ( GEN.isLayerExists({job:job,layer:cover_lyr}) ) { GEN.deleteLayer({job:job,layer:[cover_lyr]}) }
if (matrix[layer].side == 'top') {
sm = getLayer({layer_type:"solder_mask", context:"board", side:"top"})[0];
outer = getLayer({layer_type:"signal", context:"board", side:"top"})[0];
GEN.createLayer({job:job,layer:cover_lyr,context:'board',type:'document',before:layer,delete_exists:'yes'});
}else{
sm = getLayer({layer_type:"solder_mask", context:"board", side:"bottom"})[0];
outer = getLayer({layer_type:"signal", context:"board", side:"bottom"})[0];
GEN.createLayer({job:job,layer:cover_lyr,context:'board',type:'document',before:layer,delete_exists:'yes'});
}
if ( GEN.isLayerExists({job:job,layer:sm}) ) {
GEN.affectedLayer({affected:'yes',layer:[sm],clear_before:'yes'});
GEN.selectByFilter({polarity:'positive',profile:'all'});
GEN.selCopyOther({dest:'layer_name',target_layer:cover_lyr,invert:'no',size:2*info.ss_to_sm});
}
if ( GEN.isLayerExists({job:job,layer:outer}) ) {
GEN.affectedLayer({affected:'yes',layer:[outer],clear_before:'yes'});
GEN.selectByFilter({attribute:['.smd'],profile:'all'});
if ( GEN.getSelectCount() > 0 ){GEN.selCopyOther({dest:'layer_name',target_layer:cover_lyr,invert:'no',size:2*info.ss_to_smd});}
GEN.selectByFilter({attribute:['.bga'],profile:'all',});
if ( GEN.getSelectCount() > 0 ){GEN.selCopyOther({dest:'layer_name',target_layer:cover_lyr,invert:'no',size:2*info.ss_to_bga});}
}
if ( GEN.isLayerExists({job:job,layer:outline}) ) {
var outline_tmp = outline + '_tmp_tl';
GEN.copyLayer({source_job:job,source_step:step,source_layer:outline,dest_layer:outline_tmp,mode:'replace',invert:'no'}) ;
GEN.affectedLayer({affected:'yes',layer:[outline_tmp],clear_before:'yes'});
GEN.selectByFilter({feat_types:'line\;arc',polarity:'positive',profile:'all'});
if ( GEN.getSelectCount() > 0 ){ GEN.selChangeSym({symbol:'r'+par.outline_size}) }
GEN.copyLayer({source_job:job,source_step:step,source_layer:outline_tmp,dest_layer:cover_lyr,mode:'append',invert:'no'})
GEN.deleteLayer({job:job,layer:[outline_tmp],step:step});
}
})
})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.clearLayers()
}
// 字符 和 文字框分开
function ssFrameSeparate () {
// 1. step过滤
var workstep = getWorkStep()
if(!Array.isArray(workstep)){throw "工作step错误"}
// 2.过滤工作层
var work_layers = getLayer({layer_type:"silk_screen", context: "board"})
if(/yes/ig.test(par.select_lyr)){
var matrix = GEN.getMatrix({job:job});
var layers = Object.keys(matrix).map(function(key){
var tmp ={};
tmp[key] = key;
return tmp
})
work_layers = gui.selectMultiple({title: "请先择工作层",list: layers,defaultvalue: work_layers,columns: 4,gen: GEN})
}
if(work_layers.length == 0 ) {return "没有先择layer"}
var info = gui.showForm({
title : '请手动匹配以下信息',
showcheck : 1,gen:GEN,
defaultsize:[500,250],
ui: {
type: 'ScrollArea',
property: { widget_resizable: true, frame_shape: 'NoFrame', align: 'Top' },
child: {
type: 'VBoxLayout',
property: { margin: 2, spacing: 5, align: 'Top' },
pack: { stretch: 0 },
child:[{
type: "FormGridLayout",
property: { columns: 1, label_alignment: 'Top | Right', margin: 10, spacing: 20 },
pack: { stretch: 0 },
child:[{
name : 'text_height',
pack: {label : '文字最大高度'},
type : 'LineEdit',
setter: function(obj){ obj.setText() },
property: { value:par.text_height * 1000,enabled: true },
units:par.units == 'inch' ? 'mil' : 'um'
},{
name : 'type',
pack: { label: '类型' },
type : 'RadioBox',
property: { enabled: true,item_list:[{name : 'separate', text:'字框分离'},{name:"change",text:"字框切换"}]}
},
{
type: "stretch"
}]
}]
}
}
});
if(!info){throw "未填写参数"}
info = JSON.parse(JSON.stringify(info));
if(info.type == ""){info.type = "separate"}
var matrix = GEN.getMatrix({job:job})
workstep.forEach(function(step){
GEN.openStep({job:job,name:step});
GEN.clearLayers();
GEN.affectedLayer({ mode:'all',affected:'no'} );
GEN.units({ type:par.units });
GEN.zoomHome();
var layer_count = GEN.getLayerCount({job:job}) // IKM.get_jobinfo({jobid: JobId, jobinfo: "layer_count"})
GEN.COM('disp_off');
if (info["type"] == 'separate') {
work_layers.forEach(function(layer){
// 备份文字层
var bk = layer + par.bk_suffix;
GEN.copyLayer({source_job:job,source_step:step,source_layer:layer,dest_layer:bk,mode:'replace', invert:'no'})
// 分离出的文字层
var ss_text = layer + par.silk_suffix;
if (matrix[layer]["side"] == 'top') {
GEN.createLayer({job:job,layer:ss_text,context:'board',type:'document',before:layer,delete_exists:'yes'});
}else{
GEN.createLayer({job:job,layer:ss_text,context:'board',type:'document',after:layer,delete_exists:'yes'});
}
// 开始分离文字
GEN.affectedLayer({affected:'yes',layer:layer,clear_before:'yes'});
GEN.COM("filter_reset,filter_name=popup");
GEN.selectByFilter({feat_types:'line\;arc',polarity:'positive',profile:'all'});
if ( GEN.getSelectCount() > 0 ){
var ss_line_arc = layer + '_line_arc_tl_script';
selCopyOther({layer:ss_line_arc,delExist: true})
GEN.affectedLayer({affected:'yes',layer:ss_line_arc,clear_before:'yes'});
GEN.selChangeSym({symbol:'r0.2'});
GEN.COM("filter_reset,filter_name=popup");
GEN.selectByFilter({feat_types:'line',polarity:'positive',profile:'all'});
//将直线固定角度分离去除
var ss_line = layer + '_line_tl_script';
if ( GEN.getSelectCount() > 0 ){
selCopyOther({layer:ss_line,delExist: true})
GEN.affectedLayer({affected:'yes',layer:ss_line,clear_before:'yes'});
var angle = [];
var tol = 0.2;
if(GEN.GEN_TYPE == 'genesis'){
angle = [-180,-135,-90,-45,0,45,90,135];
}else{
angle = [0,45,90,135,180,225,270,315];
}
angle.forEach(function(angl){
if(GEN.GEN_TYPE == 'genesis'){
var min_angle = (angl-tol < -180) ? -180 : (angl-tol);
var max_angle = (angl+tol > 180) ? 180 : (angl+tol);
GEN.COM('filter_set',{filter_name:'popup',update_popup:'yes',slot:'line',slot_by:'angle',min_angle:min_angle,max_angle:max_angle});
}else{
GEN.COM('set_filter_angle',{direction:'ccw',max_angle:angl+tol,min_angle:angl-tol,slot:'lines'});
GEN.COM("adv_filter_set,ccw_rotations=,filter_name=popup,mirror=any,bound_box=no,active=yes,srf_values=no,srf_area=no,limit_box=no");
}
GEN.COM("filter_area_strt");
GEN.COM("filter_area_end,filter_name=popup,operation=select");
})
if ( GEN.getSelectCount() > 0 ){GEN.selDelete()}
}
if(GEN.isLayerExists({job:job,layer:ss_line})){
// 利用制作的套层
var cover_lyr = layer + par.cover_layer_suffix;
GEN.affectedLayer({affected:'yes',layer:[cover_lyr],clear_before:'yes'});
GEN.COM("filter_reset,filter_name=popup");
GEN.COM("filter_set,filter_name=popup,update_popup=no,include_syms=r*");
GEN.COM("filter_set,filter_name=popup,update_popup=no,exclude_syms=rect*");
GEN.COM("filter_area_strt");
GEN.COM("filter_area_end,filter_name=popup,layer=,operation=select,inside_area=no,intersect_area=no,area_type=none");
GEN.COM("filter_reset,filter_name=popup");
GEN.COM("sel_reverse");
var cover_lyr_2 = cover_lyr + '_tmp_tl';
if ( GEN.getSelectCount() > 0 ){
GEN.createLayer({job:job,layer:cover_lyr_2,delete_exists:'yes'});
GEN.selCopyOther({target_layer:cover_lyr_2,invert:'no'});
}
GEN.affectedLayer({affected:'yes',layer:[ss_line_arc],clear_before:'yes'});
GEN.selContourize();
if(GEN.GEN_TYPE == 'incam'){
GEN.COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
GEN.COM("filter_atr_reset,filter_name=ref_select");
}
GEN.COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers="+ss_line);
var layer_tmp1 = layer + '_tmp1_tl';
if ( GEN.getSelectCount() > 0 ){
GEN.createLayer({job:job,layer:layer_tmp1,delete_exists:'yes'});
GEN.selMoveOther({target_layer:layer_tmp1,invert:'no'});
}
if(GEN.GEN_TYPE == 'incam'){
GEN.COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
GEN.COM("filter_atr_reset,filter_name=ref_select");
}
GEN.COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers="+cover_lyr_2);
var layer_tmp2 = layer + '_tmp2_tl';
if ( GEN.getSelectCount() > 0 ){
GEN.createLayer({job:job,layer:layer_tmp2,delete_exists:'yes'});
GEN.selCopyOther({target_layer:layer_tmp2,invert:'no'});
}
GEN.COM("sel_clean_surface,max_fold_len=0,clean_size="+info.text_height+",clean_mode=x_and_y,accuracy=0");
if (GEN.isLayerExists({job:job,layer:"layer_tmp2"})) {
GEN.affectedLayer({affected:'yes',layer:[layer_tmp2],clear_before:'yes'});
if(GEN.GEN_TYPE == 'incam'){
GEN.COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
GEN.COM("filter_atr_reset,filter_name=ref_select");
}
GEN.COM("sel_ref_feat,pads_as=shape,mode=disjoint,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers="+ss_line_arc);
if ( GEN.getSelectCount() > 0 ){
GEN.selMoveOther({target_layer:layer_tmp1,invert:'no'});
}
}
if (GEN.isLayerExists({job:job,layer:layer_tmp1})) {
GEN.affectedLayer({affected:'yes',layer:[layer_tmp1],clear_before:'yes'});
if(GEN.GEN_TYPE == 'incam'){
GEN.COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
GEN.COM("filter_atr_reset,filter_name=ref_select");
}
GEN.COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=negative,layers="+layer);
if ( GEN.getSelectCount() > 0 ){GEN.selDelete() };
GEN.affectedLayer({affected:'yes',layer:[layer],clear_before:'yes'});
if(GEN.GEN_TYPE == 'incam'){
GEN.COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
GEN.COM("filter_atr_reset,filter_name=ref_select");
}
GEN.COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers="+layer_tmp1);
if ( GEN.getSelectCount() > 0 ){
GEN.selMoveOther({target_layer:ss_text,invert:'no'});
}
}
// 将文字属性挑选
GEN.COM("filter_reset,filter_name=popup");
GEN.selectByFilter({feat_types:'text'} );
if ( GEN.getSelectCount() > 0 ){
GEN.selMoveOther({target_layer:ss_text,invert:'no'});
}
delLayer([ss_line_arc,ss_line,cover_lyr_2,layer_tmp1,layer_tmp2]);
}
}
})
}
GEN.COM("disp_on")
var ref_layers = work_layers.filter(function(layer){ return GEN.isLayerExists({job:job, layer:layer + par.silk_suffix}) })
// if(ref_layers.length > 0) {
// GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
// while (1) {
// LOOP:
// GEN.COM('disp_on');
// while(1){
// work_layer = GEN.getWorkLayer();
// last if (grep($_ eq work_layer ,@work_layers) or grep($_.$PAR->{silk_suffix} eq work_layer ,@work_layers));
// update_loading("请选择一个文字层或者文字框层设为工作层",0,position:'n');
// my $ans = GEN.PAUSE('Please Set Work Layer');
// return 'Cancel' unless $ans eq 'OK';
// }
// // 给出默认移动层
// if (grep($_ eq work_layer ,@work_layers)) {
// ref_layer = work_layer.$PAR->{silk_suffix};
// }else if(grep($_.$PAR->{silk_suffix} eq work_layer ,@work_layers)){
// ref_layer = work_layer;
// ref_layer =~ s/\Q$PAR->{silk_suffix}\E$//;
// }
// if (! GEN.isLayerExists({job:job,layer:ref_layer}) ){
// IKM.msg("没有找到对应层"+ref_layer+" ,请重新选择工作层!")
// goto LOOP;
// }
// GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
// GEN.displayLayer({name:ref_layer,number:2});
// update_loading("请选择需移动的文字或者的文字框,不需制作了请【左键框选空白处】",0,position:'n');
// var tmp_con = GEN.MOUSE({type:'r',text:"Please Select"});
// work_layer = GEN.getWorkLayer();
// GEN.COM('disp_off');
// // 允许人员手动换工作层,重新判断移动层
// if (grep($_ eq work_layer ,@work_layers)) {
// ref_layer = work_layer.$PAR->{silk_suffix};
// }else if(grep($_.$PAR->{silk_suffix} eq work_layer ,@work_layers)){
// ref_layer = work_layer;
// ref_layer =~ s/\Q$PAR->{silk_suffix}\E$//;
// }
// if (! GEN.isLayerExists({job:job,layer:ref_layer}) ){
// IKM.msg("没有找到对应层"+ref_layer+" ,请重新选择工作层!")
// goto LOOP;
// }
// // GEN.workLayer(name:work_layer,display_number:1,clear_before:'yes');
// GEN.displayLayer({name:ref_layer,number:2});
// if ( GEN.getSelectCount() > 0 ){
// GEN.selSubstitute({tol:1,mode:'select'});
// GEN.selMoveOther({target_layer:ref_layer,invert:'no'});
// }else{
// GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
// GEN.selectByFilter({area_rect:tmp_con});
// if ( GEN.getSelectCount() > 0 ){
// GEN.selSubstitute({tol:1,mode:'select'});
// GEN.selMoveOther({target_layer:ref_layer,invert:'no'});
// }
// else{
// GEN.COM('disp_on');
// last;
// }
// }
// }
// } else {
// IKM.msg("没有找到文字框和对应的文字层,程序将退出。")
// }
})
}
// 文字框按阻焊扩大
// 文字放大
function selCopyOther(props){ // {layer , invent, dx, dy , size}
if(GEN.getSelectCount()>0){ if(!props || !props.layer){return}
if(props.delExist){if(GEN.isLayerExists({job:job, layer:props.layer})){GEN.deleteLayer({job:job, layer:[props.layer]})}}
GEN.selCopyOther({dest:'layer_name',target_layer:props.layer,invert:props.invert || 'no',dx:props.dx || 0,dy:props.dy || 0,size:props.size || 0})
}
}
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 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.confirm = function(props) {
props = props || {}
return gui.confirm(props.content || "content",props.button || ["yes", "no"], props.type || "question");
}
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"] || [""],
"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.selectLayer = function(props){
props = props || {}
return gui.selectLayer({
title: props.title || "请选择层",
filter: props.filter || ".*", // regular expression
selectmode: props.selectmode || "multiple", // single, multiple
context: props.context || "all", // all, board, misc
layertype: props.layertype || "signal", // default type of layertypelist
defaultsize: props.defaultsize || [600, 400], // window size
layermatrix: props.layermatrix || props.matrix,
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"; }}
],
gen: props.GEN || GEN
})
}
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",
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
}
function delLayer(layer){
if(!Array.isArray(layer)){
layer = [layer]
}
layer = layer.filter(function(v){return GEN.isLayerExists({job:job, layer:v})})
if(layer.length){
GEN.deleteLayer({job:job, layer:[layer]})
}
} }
\ No newline at end of file
=head
NAME:
DESCRIPTION: 放大文字框
PARAMETER:
[
{
name : 'step_filter',
title : '工作Step',
type : 'LineEdit',
property:{tool_tip:''}
},
{
name : 'ss_suffix',
title : '分离文字字符层层后缀',
type : 'LineEdit',
property:{tool_tip:'如未设置,则默认为:-ref'},
},
{
name : 'sm_ref',
title : '文字辅助层后缀',
type : 'LineEdit',
property:{tool_tip:'如未设置,则默认为:-ref'},
},
{
name : 'is_select_lyr',
type : 'RadioBox',
title : '是否选择层别',
property : {tool_tip:'未设定,则默认no',
size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'del_backup',
type : 'RadioBox',
title : '删除TL备份层',
property : {tool_tip:'未设定,则默认yes',size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'Yes',text:'Yes'},
{name:'No',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2017-3-22 Cody Yu
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 文字框放大 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<font color="#008000"><p> ● 无</p></font>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
=cut
use strict;
use Encode;
use utf8;
use Data::Dump 'dump';
my ($Job,$Step) = ($JOB,undef);
$PAR->{is_select_lyr} = $PAR->{is_select_lyr} || 'no';
$PAR->{del_backup} = 'yes' unless $PAR->{del_backup};
$PAR->{sm_ref} = '-ref' unless $PAR->{sm_ref};
$PAR->{save_job} = 'No' unless $PAR->{save_job};
my $Return = 'done';
my $units = 'inch';
$PAR->{crate_tmp} = 'yes' unless $PAR->{crate_tmp};
$PAR->{tol} = 1;
try {
##
show_loading("判断是否选择料号..",0,position=>'n');
unless( $Job){
$GUI->msgbox(-icon=>'error',-text=>"请先选择料号后再执行脚本!");
return 'Cancel';
}
update_loading("检查${Job}是否存在..",0,position=>'n');
##检查料号是否存在
unless ( $GEN->isJobExists(job=>$Job) ){
$GUI->msgbox(-icon=>'error',-text=>"料号 $Job 不存在,请确认。");
return 'Cancel';
}
update_loading("正在打开料号$Job...",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
###选择工作step
update_loading("过滤工作step...",0,position=>'n');
my @steps = $GEN->getStepList(job=>$Job);
if ( @steps == 0 ) {
$GUI->msgbox(-icon=>'error',-text=>'在料号中没有Step存在,你将退出!');
return 0;
}
elsif (@steps != 1){
$PAR->{step_filter} = '.*' unless $PAR->{step_filter};
my @tmp_steps = grep(/$PAR->{step_filter}/,@steps);
if ( @tmp_steps == 0 ) {
$GUI->msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!');
return 'Cancel';
}
elsif ( @tmp_steps == 1 ) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'请选择工作Step',
-steplist=>[@tmp_steps],
-selectmode=>'single');
return 'Cancel' unless ($Step);
}
}
else {
$Step = $steps[0];
}
$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=>$units );
$GEN->zoomHome();
##过滤 board layers
update_loading("过滤工作层...",0,position=>'n');
my @work_layers = get_work_layer();
return 'Cancel' if $work_layers[0] eq 'Cancel';
##创建辅助层
$PAR->{crate_tmp} = 'no';
if( $PAR->{crate_tmp} =~ /yes/i ){
update_loading("正在创建文字层对应的防焊参考层,请稍候...",0,position=>'n');
foreach my $layer(@work_layers){
my $sm_layer = $layer eq 'c1' ? 'm1' : 'm2';
my $ref_layer = $layer.'-cover+';
next unless ( $GEN->isLayerExists(job=>$Job,layer=>$sm_layer) );
if( $layer =~ /^c2/ ){
$GEN->createLayer(job=>$Job,layer=>$ref_layer,context=>'misc',type=>'document',after=>$layer) unless( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
}
else{
$GEN->createLayer(job=>$Job,layer=>$ref_layer,context=>'misc',type=>'document',before=>$layer) unless( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
}
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$sm_layer,dest_layer=>$ref_layer,mode=>'replace',invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$ref_layer],clear_before=>'yes');
$GEN->selContourize();
$GEN->COM('sel_resize',size=>10,corner_ctl=>'no');
}
}
foreach my $layer(@work_layers){
if ($GEN->isLayerExists(job=>$Job,layer=>$layer.$PAR->{ss_suffix})) {
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$layer.$PAR->{ss_suffix},dest_layer=>$layer.'_tl+++',mode=>'replace',invert=>'no');
}else{
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$layer,dest_layer=>$layer.'_tl+++',mode=>'replace',invert=>'no');
}
}
# 开始放大文字框
my $default_layer = $work_layers[0];
my $ref_layer = $work_layers[0].$PAR->{sm_ref};
if ($GEN->isLayerExists(job=>$Job,layer=>$work_layers[0].$PAR->{ss_suffix})) {
$default_layer = $work_layers[0].$PAR->{ss_suffix};
}
##
my ($tmp1,$tmp2) = ('tl_script_tmp1','tl_script_tmp2');
##
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
#$GEN->createLayer(job=>$Job,layer=>$tmp1,context=>'misc',type=>'document');
#$GEN->createLayer(job=>$Job,layer=>$tmp2,context=>'misc',type=>'document');
##
$GEN->workLayer(name=>$default_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2) if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
my %info;
$info{type} = 'silk_text';
$info{scale_type} = 'scale';
$info{x} = $info{y} = 1.05;
$info{text_x} = $info{text_y} = 1.05;
$info{text_space} = 10;
while(1){
update_loading("请确认文字放大参数,不再继续制作请点取消!",0,position=>'n');
%info = $GUI->show_form(
-title => '请确认信息:',
-showcheck => 1,-gen=>$GEN,
-defaultsize=>[380,300],
-columns =>'2',
-excludehideitem=>1,
-items=>[
{
name=>'type',
label=>'类型',
type=>'radio',
col_span=>2,
property=>{
tl_columns=>2,
tl_list=>['silk_text'=>'放大字符','silk_frame'=>'放大文字框',],
},
must_field=>1,
value=>$info{type},
validate_func=>sub{
my %par=@_;
return{} if $par{mode} eq 'save';
if (defined $par{value} and $par{value} eq 'silk_text'){
$par{formpanel}->set_item_visible(title2=>1);
$par{formpanel}->set_item_visible(text_type=>1);
$par{formpanel}->set_item_visible(title1=>0);
$par{formpanel}->set_item_visible(scale_type=>0);
$par{formpanel}->set_value(scale_type=>$info{scale_type}||'scale');
}
else{
$par{formpanel}->set_item_visible(title2=>0);
$par{formpanel}->set_item_visible(text_type=>0);
$par{formpanel}->set_value(text_type=>$info{text_type}||'single');
$par{formpanel}->set_item_visible(title1=>1);
$par{formpanel}->set_item_visible(scale_type=>1);
}
return {};
},
},
{
name=>'title1',
type=>'frame',
property=>{label=>'放大字符框参数:'},
expand=>1,
},
{
name=>'scale_type',
label=>'模式',
type=>'radio',
col_span=>2,
property=>{
tl_columns=>2,
tl_list=>['scale'=>'按比例放大','value'=>'按间距放大'],
},
must_field=>1,
value=>$info{scale_type},
validate_func=>sub{
my %par=@_;
return{} if $par{mode} eq 'save';
if (defined $par{value} and $par{value} eq 'value'){
$par{formpanel}->set_item_visible(x=>0);
$par{formpanel}->set_item_visible(y=>0);
$par{formpanel}->set_item_visible(value_x=>1);
$par{formpanel}->set_item_visible(value_y=>1);
}
else{
$par{formpanel}->set_item_visible(x=>1);
$par{formpanel}->set_item_visible(y=>1);
$par{formpanel}->set_item_visible(value_x=>0);
$par{formpanel}->set_item_visible(value_y=>0);
}
return {};
},
},
{
name => 'x',
label => 'X',
type => 'number',
value=>$info{x}||1.05,
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('scale_type');
if ($value eq 'scale'){
return 'show';
}
else{
return 'hide';
}
},
},
{
name => 'y',
label => 'Y',
type => 'number',
value=>$info{y}||1.05,
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('scale_type');
if ($value eq 'scale'){
return 'show';
}
else{
return 'hide';
}
},
},
{
name => 'value_x',
label => 'X',
type => 'number',
units=>'mil',
must_field=>1,
value=>$info{value_x},
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('scale_type');
if ($value eq 'value'){
return 'show';
}
else{
return 'hide';
}
},
},
{
name => 'value_y',
label => 'Y',
type => 'number',
units=>'mil',
must_field=>1,
value=>$info{value_y},
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('scale_type');
if ($value eq 'value'){
return 'show';
}
else{
return 'hide';
}
},
},
{
name=>'title2',
type=>'frame',
property=>{label=>'放大字符参数:'},
expand=>1,
},
{
name=>'text_type',
label=>'模式',
type=>'radio',
col_span=>2,
property=>{
tl_columns=>2,
tl_list=>['layer'=>'自动放大','single'=>'单个放大'],
},
must_field=>1,
value=>$info{text_type}||'single',
},
{
name => 'text_x',
label => 'X',
type => 'number',
value=>$info{text_x}||1.05,
},
{
name => 'text_y',
label => 'Y',
type => 'number',
value=>$info{text_y}||1.05,
},
{
name => 'text_space',
label => '字符间距',
type => 'number',
units=>'mil',
value=>$info{text_space}||10,
},
]
);
return $Return unless %info;
if( $info{type} eq 'silk_frame' ){
$default_layer = enlarge_slik_frame(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $default_layer if $default_layer eq 'Cancel';
}
else{
if( $info{text_type} eq 'layer' ){
my $ans = enlarge_slik_layer(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $ans if $ans;
}
else{
$default_layer = enlarge_text_single(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $default_layer if $default_layer eq 'Cancel';
}
}
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
}
if ($PAR->{del_backup} eq 'yes'){
foreach my $layer(@work_layers){
$GEN->deleteLayer(job=>$Job,layer=>[$layer.'_tl+++']) ;
}
}
$GEN->affectedLayer(mode=>'all',affected=>'no');
update_loading("【 放大文字框 】完成..",1,position=>'n');
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("$Job 正在保存料号,请稍候...",0,position=>'n');
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->saveJob(job=>$Job);
hide_loading();
}
unless ($GEN->{STATUS}){
return $Return;
}
else{
$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
#addFlowNotes(-notes=>" Genesis Error:\n ".join("\n ",@{$GEN->{STATUS}}));
return 'Error';
}
}
catch Error::Simple with {
my $error = shift;
$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>$error);
return 'Error';
}
finally{
$GEN->COM('disp_on');
};
sub get_work_layer{
my %par = @_;
update_loading("过滤层别...",0,position=>'n');
my @silk;
# 获取工作层
my %matrix = $GEN->getMatrix(job=>$Job,type=>'hash');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq 'board' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq 'silk_screen' ){
push @silk,$layer;
}
}
}
unless( @silk ){
$GUI->msgbox(-icon=>'warning',-text=>'资料中无文字层,请确认');
return 'Cancel';
}
if ($PAR->{is_select_lyr} eq 'yes' and scalar @silk > 1) {
my (%tmp_matrix);
foreach my $layer (@silk) {
$tmp_matrix{$layer} = $matrix{$layer};
}
@silk = $GUI->select_layer(
-title=>'请选择工作层别',
-layermatrix=>\%tmp_matrix,
-selectmode => 'multiple');#single
return 'Cancel' unless(@silk);
}
return @silk;
}
sub enlarge_slik_frame{
my %par = @_;
my $default_layer = $par{default_layer};
#$GUI->debug(dump('---111',$default_layer));
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
while(1){
#$GEN->affectedLayer(affected=>'yes',layer=>[$tmp1,$tmp2],clear_before=>'yes');
#$GEN->selDelete();
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$default_layer = undef;
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Work Layer');
return 'Cancel' unless $ans eq 'OK';
}
}
$ref_layer = $work_layer.$PAR->{sm_ref};
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
update_loading("请选择需按当前比例放大的文字框,不需制作了请【左键框选空白处】",0,position=>'n');
my %tmp_con;
if($info{scale_type} eq 'scale'){
%tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select! Scale x:$info{x} y:$info{y}");
}
else{
%tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select! Space x:$info{value_x} mil y:$info{value_y} mil");
}
$work_layer = $GEN->getWorkLayer();
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'warning',-text=>'没有设定工作层,程序无法继续下去!');
return 'Cancel';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$tmp1,invert=>'no');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->selectByFilter(area_rect=>\%tmp_con);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$tmp1,invert=>'no');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
$default_layer = $GEN->getWorkLayer();
last;
}
}
$GEN->COM('disp_off');
$GEN->units( type=>$units );
##获取涨缩信息
my $text_tmp = 'tl_tmp_text';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$text_tmp,mode=>'replace',invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$text_tmp],clear_before=>'yes');
$GEN->selectByFilter(feat_types=>'line\;arc',polarity=>'positive',profile=>'all');
$GEN->COM('sel_change_sym', symbol => 'r0')if ( $GEN->getSelectCount() > 0 );
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$text_tmp,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley);
if( $info{scale_type} eq 'scale' ){
$scalex = $info{x};
$scaley = $info{y};
}
else{
#my $new_limits;
#$new_limits->{xsize} = $layer_limits->{xsize}+($info{value_x}/1000)*2;
#$new_limits->{ysize} = $layer_limits->{ysize}+($info{value_y}/1000)*2;
#$scalex = $new_limits->{xsize}/$layer_limits->{xsize};
#$scaley = $new_limits->{ysize}/$layer_limits->{ysize};
$scalex = 1 + ($info{value_x}*2)/($layer_limits->{xsize}*1000);
$scaley = 1 + ($info{value_y}*2)/($layer_limits->{ysize}*1000);
}
$GEN->deleteLayer(job=>$Job,layer=>[$text_tmp]);
##
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'yes');
$GEN->selTransform(mode=>'anchor',oper=>'scale',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley);
my $tmp_symbol = 'tl_script_tmp';
#$GEN->COM( "delete_entity,job=$Job,type=symbol,name=$tmp_symbol" ) if( $GEN->isSymbolExists(job=>$Job,symbol=>$tmp_symbol) );
$GEN->COM('sel_all_feat');
$GEN->COM( "sel_create_sym,symbol=$tmp_symbol,x_datum=0,y_datum=0,delete=no,fill_dx=0.1,fill_dy=0.1,attach_atr=no,retain_atr=no" );
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->selRefFeat(layers=>$tmp2,use=>'filter',mode=>'cover');
$GEN->COM( "sel_substitute,mode=substitute,symbol=$tmp_symbol,tol=$PAR->{tol},x_datum=0,y_datum=0,dcode=0" );
$GEN->selectByFilter(include_syms=>$tmp_symbol);
$GEN->selBreak()if ( $GEN->getSelectCount() > 0 );
$GEN->COM('disp_on');
$default_layer = $GEN->getWorkLayer();
$GEN->COM('truncate_layer', layer =>$tmp1);
$GEN->COM('truncate_layer', layer =>$tmp2);
if( $GEN->{STATUS} ){
#$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
$GEN->units(type=>$units);
}
return $default_layer;
}
sub enlarge_slik_layer{
my %par = @_;
my $default_layer = $par{default_layer};
my %info = %{$par{info}};
my ($curlayer,$testlayer) = ($par{tmp1},$par{tmp2});
while(1){
update_loading("请将需要放大的文字move到一个辅助层上并设为工作层...",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Layer');
return 'Cancel' unless $ans eq 'OK';
$curlayer = $GEN->getWorkLayer();
last unless $curlayer;
unless ( $GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$curlayer) ){
$GEN->affectedLayer(affected=>'yes',layer=>[$curlayer],clear_before=>'yes');
$GEN->selCopyOther(target_layer=>$testlayer,invert=>'no',size=>$info{text_space});
}
else{
last;
}
update_loading("正在放大$curlayer 层上字符,请稍候...",0,position=>'n');
my $ref_layer = 'tl_silk_layer';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$curlayer,dest_layer=>$ref_layer,mode=>'replace',invert=>'no');
$GEN->COM('disp_off');
$GEN->units( type=>$units );
##获取涨缩信息
$GEN->affectedLayer(affected=>'yes',layer=>[$testlayer],clear_before=>'yes');
$GEN->selContourize(accuracy=>0.25,clean_hole_size=>3,clean_hole_mode=>'x_and_y');
$GEN->workLayer(name=>$curlayer,display_number=>1,clear_before=>'yes');
$GEN->affectedLayer(affected=>'yes',layer=>[$testlayer]);
# $GEN->PAUSE('AAAAA');
my $index = 1;
while( 1 ) {
$GEN->COM("reset_filter_criteria,filter_name=popup,criteria=all");
$GEN->COM('filter_reset',filter_name=>'popup');
$GEN->COM("adv_filter_reset");
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
$GEN->COM('adv_filter_set',filter_name=>'popup',update_popup=>'yes',indexes=>$index);
$GEN->COM('filter_area_strt');
$GEN->COM('filter_area_end',layer=>$testlayer,filter_name=>'popup',operation=>'select',area_type=>'none',inside_area=>'no',intersect_area=>'no');
if ( $GEN->getSelectCount() > 0 ){
my $layer_limits = getLayerLimits(job=>$Job,step=>$Step,layer=>$testlayer,units=>$units,options => 'select');
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
$GEN->COM("adv_filter_reset");
$GEN->COM("reset_filter_criteria,filter_name=ref_select,criteria=all");
$GEN->COM("sel_ref_feat,layers=,use=select,mode=touch,pads_as=shape,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,include_syms=,exclude_syms=");
if ( $GEN->getSelectCount() > 0 ){
$GEN->selTransform(mode=>'anchor',oper=>'scale',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$info{text_x},y_scale=>$info{text_y});
}
}
else {
last;
}
$index++;
}
#$GEN->COM('truncate_layer', layer =>$testlayer);
$default_layer = $curlayer;
$GEN->COM('disp_on');
$GEN->workLayer(name=>$curlayer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2) if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
update_loading("请确认$curlayer 文字放大结果并制作到正式文字层...",0,position=>'n');
$ans = $GEN->PAUSE('Please Check');
return 'Cancel' unless $ans eq 'OK';
#$GEN->COM('truncate_layer', layer =>$curlayer);
$GEN->deleteLayer(job=>$Job,layer=>[$ref_layer]);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
if( $GEN->{STATUS} ){
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
$GEN->units(type=>$units);
}
return undef;
}
sub enlarge_text_single{
my %par = @_;
my $default_layer = $par{default_layer};
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
while(1){
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$default_layer = undef;
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Work Layer');
return 'Cancel' unless $ans eq 'OK';
}
}
#$ref_layer = $work_layer.'_tl+++';
$GEN->displayLayer(name=>$ref_layer,number=>2)if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
update_loading("请选择需按当前比例放大的字符,不需制作了请【左键框选空白处】",0,position=>'n');
my %tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select! Scale x:$info{text_x} y:$info{text_y}");
$work_layer = $GEN->getWorkLayer();
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'warning',-text=>'没有设定工作层,程序无法继续下去!');
return 'Cancel';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$tmp1,invert=>'no');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->selectByFilter(area_rect=>\%tmp_con);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$tmp1,invert=>'no');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2) if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
$default_layer = $GEN->getWorkLayer();
last;
}
}
$GEN->COM('disp_off');
$GEN->units( type=>$units );
##获取涨缩信息
$GEN->affectedLayer(affected=>'yes',layer=>[$tmp1],clear_before=>'yes');
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$tmp1,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley) = ($info{text_x},$info{text_y});
##
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'yes');
$GEN->selTransform(mode=>'anchor',oper=>'scale',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley);
$GEN->selMoveOther(target_layer=>$work_layer,invert=>'no');
$default_layer = $work_layer;
$GEN->COM('truncate_layer', layer =>$tmp1);
$GEN->COM('disp_on');
if( $GEN->{STATUS} ){
$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
$GEN->units(type=>$units);
}
return $default_layer;
}
####GEN lib no options 属性
sub getLayerLimits {
my %par = @_;
$par{units} = 'inch' if (! defined $par{units});
my %return;
$GEN->INFO(
'units'=>$par{units},
'entity_type'=>'layer',
'entity_path'=>"$par{job}/$par{step}/$par{layer}",
'data_type'=>'limits',
'options' => $par{options}
);
$return{xmin} = $GEN->{doinfo}{gLIMITSxmin};
$return{ymin} = $GEN->{doinfo}{gLIMITSymin};
$return{xmax} = $GEN->{doinfo}{gLIMITSxmax};
$return{ymax} = $GEN->{doinfo}{gLIMITSymax};
$return{xsize} = $return{xmax} - $return{xmin};
$return{ysize} = $return{ymax} - $return{ymin};
if (wantarray){
return %return;
}else{
return {%return};
}
}
__END__
=head
NAME:
DESCRIPTION:
PARAMETER:
[
{
name : 'step_filter',
title : '工作step',
type : 'LineEdit',
property : {tool_tip : '过滤Step名称'},
},
{
name : 'units',
title : '单位',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'inch',text:'INCH'},
{name:'mm',text:'MM'},
],
tool_tip:'工作单位,未设定,默认为INCH'
},
pack : {row:1,column:1},
},
{
name : 'cover_layer_suffix',
title : '文字套层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'silk_suffix',
title : '分离的文字层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'text_height',
title : '文字最大高度',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'select_lyr',
title : '选择层别',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'未设定,默认为Yes'
},
pack : {row:1,column:1},
},
{
name : 'bk_suffix',
title : '备份层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2019-05-24 Shyer
1.新需求
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 保存料号.</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<font color="#008000"><p> ● </p></font>
<p> </p>
<br>
</body></html>
=cut
use strict;
#my ($JOB,$GEN,$GUI,$DB,$JOB_ID,$PAR,$APP,$MW);
use utf8;
use Encode;
use Data::Dump 'dump';
my $Return = 'done';
my ($Job,$Step) = ($JOB,undef);
$PAR->{units} = 'inch' unless $PAR->{units};
$PAR->{del_backup} = 'no' unless $PAR->{del_backup};
$PAR->{save_job} = 'no' unless $PAR->{save_job};
$PAR->{select_lyr} = 'yes' unless($PAR->{select_lyr});
$PAR->{cover_layer_suffix} = '_cover_tl+' unless($PAR->{cover_layer_suffix});
unless($PAR->{outline_size}){
$PAR->{outline_size} = $PAR->{units} eq 'inch' ? 16 : 200;
}
unless($PAR->{text_height}){
$PAR->{text_height} = $PAR->{units} eq 'inch' ? 0.06 : 1.524;
}
$PAR->{cover_layer_suffix} = '_cover_tl+' unless($PAR->{cover_layer_suffix});
doScript("SHT_FUC");
my %matrix;
try {
show_loading("判断是否选择料号..",0,position=>'n');
unless( $Job){
$GUI->msgbox(-icon=>'error',-text=>"请先选择料号后再执行脚本!");
return 'Cancel';
}
##
update_loading("检查料号${Job}是否存在 ,请稍候..",0,position=>'n');
unless ( $GEN->isJobExists(job=>$Job) ){
$GUI->msgbox(-icon=>'error',-text=>"料号 ${Job} 在Genesis中不存在, 请检查!");
return 'Error';
}
##
update_loading("正在打开料号${Job} ,请稍候..",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
##
update_loading("过滤工作step...",0,position=>'n');
my $ans_step = get_work_step();
return 'Cancel' if $ans_step eq 'Cancel';
##
update_loading("过滤层别...",0,position=>'n');
my @work_layers = get_work_layer();
return 'Cancel' if $work_layers[0] eq 'Cancel';
my %info = $GUI->show_form(
-title => '请手动匹配以下信息',
-showcheck => 1,-gen=>$GEN,
-defaultsize=>[500,250],
-items=>[
{
name=>'type',
type=>'radio',
label=>'类型',
value=>'separate',
property=>{
tl_columns => 2,
tl_list => [separate => '字框分离', change=>'字框切换'],
},
validate_func=>sub{
my %par = @_;
return {} if($par{mode} eq 'save');
if ($par{value} eq 'separate') {
$par{formpanel}->set_item_visible(text_height=>1);
}else{
$par{formpanel}->set_item_visible(text_height=>0);
}
return {};
}
},
{
name => 'text_height',
label => '文字最大高度',
type => 'number',
value=>$PAR->{text_height}*1000,
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
]
);
return 'Cancel' unless %info;
#
###
update_loading("打开${Step} ,请稍候..",0,position=>'n');
$GEN->openStep(job=>$Job,name=>$Step);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->units( type=>$PAR->{units} );
$GEN->zoomHome();
my $layer_count = $IKM->get_jobinfo(-jobname=>$Job,
-jobcategory=>'work',
-jobinfo=>'layer_count');
$GEN->COM('disp_off');
if ($info{type} eq 'separate') {
foreach my $layer (@work_layers) {
update_loading("正在$layer 制作分离文字 ,请稍候..",0,position=>'n');
##备份文字层
my $bk = $layer.$PAR->{bk_suffix};
$GEN->copyLayer(source_job=>$Job,
source_step=>$Step,
source_layer=>$layer,
dest_layer=>$bk,
mode=>'replace', #append/replace
invert=>'no') ;#|'yes'
##分离出的文字层
my $ss_text = $layer.$PAR->{silk_suffix};
if ($matrix{$layer}{side} eq 'top') {
$GEN->createLayer(job=>$Job,layer=>$ss_text,context=>'board',type=>'document',before=>$layer,delete_exists=>'yes');
}else{
$GEN->createLayer(job=>$Job,layer=>$ss_text,context=>'board',type=>'document',after=>$layer,delete_exists=>'yes');
}
##开始分离文字
$GEN->affectedLayer(affected=>'yes',layer=>[$layer],clear_before=>'yes');
#$GEN->COM("filter_reset,filter_name=popup");
#$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
$GEN->COM("filter_reset,filter_name=popup");
$GEN->selectByFilter(
feat_types=>'line\;arc',
polarity=>'positive',
profile=>'all',
);
if ( $GEN->getSelectCount() > 0 ){
my $ss_line_arc = $layer.'_line_arc_tl_script';
$GEN->createLayer(job=>$Job,layer=>$ss_line_arc,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$ss_line_arc,invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$ss_line_arc],clear_before=>'yes');
$GEN->selChangeSym(symbol=>'r0.2');
#$GEN->COM('filter_reset',filter_name=>'popup');
#$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
$GEN->COM("filter_reset,filter_name=popup");
$GEN->selectByFilter(
feat_types=>'line',
polarity=>'positive',
profile=>'all',
);
##将直线固定角度分离去除
my $ss_line = $layer.'_line_tl_script';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$ss_line,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$ss_line,invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$ss_line],clear_before=>'yes');
$GEN->COM("filter_reset,filter_name=popup");
my @angle;
my $tol = 0.2;
if($GEN->{GEN_TYPE} eq 'genesis'){
@angle = (-180,-135,-90,-45,0,45,90,135);
}else{
@angle = (0,45,90,135,180,225,270,315);
}
foreach my $angle (@angle) {
if($GEN->{GEN_TYPE} eq 'genesis'){
my $min_angle = ($angle-$tol < -180) ? -180 : $angle-$tol;
my $max_angle = ($angle+$tol > 180) ? 180 : $angle+$tol;
$GEN->COM('filter_set',filter_name=>'popup',update_popup=>'yes',slot=>'line',slot_by=>'angle',min_angle=>$min_angle,max_angle=>$max_angle);
}else{
$GEN->COM('set_filter_angle',direction=>'ccw',max_angle=>$angle+$tol,min_angle=>$angle-$tol,slot=>'lines');
$GEN->COM("adv_filter_set,ccw_rotations=,filter_name=popup,mirror=any,bound_box=no,active=yes,srf_values=no,srf_area=no,limit_box=no");
}
$GEN->COM("filter_area_strt");
$GEN->COM("filter_area_end,filter_name=popup,operation=select");
}
$GEN->selDelete() if ( $GEN->getSelectCount() > 0 );
}
next if(!($GEN->isLayerExists(job=>$Job,layer=>$ss_line) and (!$GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ss_line))));
###利用制作的套层
my $cover_lyr = $layer.$PAR->{cover_layer_suffix};
$GEN->affectedLayer(affected=>'yes',layer=>[$cover_lyr],clear_before=>'yes');
$GEN->COM("filter_reset,filter_name=popup");
$GEN->COM("filter_set,filter_name=popup,update_popup=no,include_syms=r*");
$GEN->COM("filter_set,filter_name=popup,update_popup=no,exclude_syms=rect*");
$GEN->COM("filter_area_strt");
$GEN->COM("filter_area_end,filter_name=popup,layer=,operation=select,inside_area=no,intersect_area=no,area_type=none");
$GEN->COM("filter_reset,filter_name=popup");
$GEN->COM("sel_reverse");
my $cover_lyr_2 = $cover_lyr.'_tmp_tl';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$cover_lyr_2,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$cover_lyr_2,invert=>'no');
}
$GEN->affectedLayer(affected=>'yes',layer=>[$ss_line_arc],clear_before=>'yes');
$GEN->selContourize();
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
$GEN->COM("filter_atr_reset,filter_name=ref_select");
}
$GEN->COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers=$ss_line");
my $layer_tmp1 = $layer.'_tmp1_tl';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$layer_tmp1,delete_exists=>'yes');
$GEN->selMoveOther(target_layer=>$layer_tmp1,invert=>'no');
}
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
$GEN->COM("filter_atr_reset,filter_name=ref_select");
}
$GEN->COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers=$cover_lyr_2");
my $layer_tmp2 = $layer.'_tmp2_tl';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$layer_tmp2,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$layer_tmp2,invert=>'no');
}
$GEN->COM("sel_clean_surface,max_fold_len=0,clean_size=$info{text_height},clean_mode=x_and_y,accuracy=0");
if ($GEN->isLayerExists(job=>$Job,layer=>"$layer_tmp2")) {
$GEN->affectedLayer(affected=>'yes',layer=>[$layer_tmp2],clear_before=>'yes');
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
$GEN->COM("filter_atr_reset,filter_name=ref_select");
}
$GEN->COM("sel_ref_feat,pads_as=shape,mode=disjoint,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers=$ss_line_arc");
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$layer_tmp1,invert=>'no');
}
}
if ($GEN->isLayerExists(job=>$Job,layer=>"$layer_tmp1")) {
$GEN->affectedLayer(affected=>'yes',layer=>[$layer_tmp1],clear_before=>'yes');
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
$GEN->COM("filter_atr_reset,filter_name=ref_select");
}
$GEN->COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=negative,layers=$layer");
$GEN->selDelete() if ( $GEN->getSelectCount() > 0 );
$GEN->affectedLayer(affected=>'yes',layer=>[$layer],clear_before=>'yes');
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
}else{
$GEN->COM("filter_atr_reset,filter_name=ref_select");
}
$GEN->COM("sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers=$layer_tmp1");
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$ss_text,invert=>'no');
}
}
##将文字属性挑选
$GEN->COM("filter_reset,filter_name=popup");
$GEN->selectByFilter(
feat_types=>'text',
);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$ss_text,invert=>'no');
}
_deleteLayer(layer=>[$ss_line_arc,$ss_line,$cover_lyr_2,$layer_tmp1,$layer_tmp2]);
}
}
}
$GEN->COM('disp_on');
##字框切换 ## @work_layers
my $work_layer;
my $ref_layer;
my $flag = 0;
foreach my $layer (@work_layers) {
$work_layer = $layer;
$ref_layer = $layer.$PAR->{silk_suffix};
if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) ){
$flag = 1;
last;
}
}
if ($flag) {
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
while (1) {
LOOP:
$GEN->COM('disp_on');
while(1){
$work_layer = $GEN->getWorkLayer();
last if (grep($_ eq $work_layer ,@work_layers) or grep($_.$PAR->{silk_suffix} eq $work_layer ,@work_layers));
update_loading("请选择一个文字层或者文字框层设为工作层",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Work Layer');
return 'Cancel' unless $ans eq 'OK';
}
##给出默认移动层
if (grep($_ eq $work_layer ,@work_layers)) {
$ref_layer = $work_layer.$PAR->{silk_suffix};
}elsif(grep($_.$PAR->{silk_suffix} eq $work_layer ,@work_layers)){
$ref_layer = $work_layer;
$ref_layer =~ s/\Q$PAR->{silk_suffix}\E$//;
}
if (! $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) ){
$GUI->msgbox(-icon=>'warning',-text=>"没有找到对应层$ref_layer ,请重新选择工作层!");
goto LOOP;
}
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2);
update_loading("请选择需移动的文字或者的文字框,不需制作了请【左键框选空白处】",0,position=>'n');
my %tmp_con;
%tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select");
$work_layer = $GEN->getWorkLayer();
$GEN->COM('disp_off');
##允许人员手动换工作层,重新判断移动层
if (grep($_ eq $work_layer ,@work_layers)) {
$ref_layer = $work_layer.$PAR->{silk_suffix};
}elsif(grep($_.$PAR->{silk_suffix} eq $work_layer ,@work_layers)){
$ref_layer = $work_layer;
$ref_layer =~ s/\Q$PAR->{silk_suffix}\E$//;
}
if (! $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) ){
$GUI->msgbox(-icon=>'warning',-text=>"没有找到对应层$ref_layer ,请重新选择工作层!");
goto LOOP;
}
#$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selSubstitute(tol=>1,mode=>'select');
$GEN->selMoveOther(target_layer=>$ref_layer,invert=>'no');
}else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->COM("filter_reset,filter_name=popup");
$GEN->selectByFilter(area_rect=>\%tmp_con);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selSubstitute(tol=>1,mode=>'select');
$GEN->selMoveOther(target_layer=>$ref_layer,invert=>'no');
}
else{
$GEN->COM('disp_on');
last;
}
}
}
}else{
$GUI->msgbox(-icon=>'info',-title=>'标题',-text=>"没有找到文字框和对应的文字层,程序将退出。");
return 'Cancel';
}
$GEN->workLayer(name=>$work_layers[0],display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$work_layers[0].$PAR->{silk_suffix},number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$work_layers[0].$PAR->{silk_suffix}) );
$GEN->COM('sel_clear_feat');
#$GEN->clearLayers();
#$GEN->affectedLayer( mode=>'all',affected=>'no' );
update_loading("程序运行完成,请检查运行结果..",0,position=>'n');
sleep(2);
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("$Job 正在保存料号,请稍候...",0,position=>'n');
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->saveJob(job=>$Job);
hide_loading();
}
unless ($GEN->{STATUS}){
return $Return;
}
else{
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
addFlowNotes(-notes=>" Genesis Error:\n ".join("\n ",@{$GEN->{STATUS}}));
return 'Error';
}
}
catch Error::Simple with {
my $error = encode("utf8",shift);
$GUI->msgbox(-icon=>'error',-text=>$error);
return 'Error';
}
finally{
};
######################################################################################
sub get_work_step {
my @steps = $GEN->getStepList(job=>$Job);
if ( @steps == 0 ) {
$GUI->msgbox(-icon=>'error',-text=>'在料号中没有Step存在,你将退出!');
return 'Cancel';
}
elsif (@steps != 0){
my @tmp_steps = grep(/$PAR->{step_filter}/,@steps);
if ( @tmp_steps == 0 ) {
$GUI->msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!');
return 'Cancel';
}
elsif (@tmp_steps == 1) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'请选择工作 Step',
-steplist=>[@tmp_steps],
-default=>[$tmp_steps[0]],
-gen=>$GEN,
-selectmode=>'single');
return 'Cancel' unless ($Step);
}
}
return undef;
}
sub isChecklistExist{
my %par = @_ ;
my @chklists = $GEN->getChecklist(job=>$par{job},step=>$par{step});
if(grep /^$par{checkklist}$/,@chklists){
return 1;
}
else{
return 0;
}
}
sub get_work_layer{
my @work_layers;
# 获取工作层
%matrix = $GEN->getMatrix(job=>$Job,type=>'hash');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq 'board' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq 'silk_screen' ){
push @work_layers,$layer;
}
}
}
#
my %tmp_matrix;
foreach my $layer (@work_layers) {
$tmp_matrix{$layer} = $matrix{$layer};
}
##
if (@work_layers > 1 and $PAR->{select_lyr} eq 'yes') {
@work_layers = $GUI->select_layer(
-title=>'请选择工作层别',
-layermatrix=>\%tmp_matrix,
-selectmode => 'multiple');#single
return 'Cancel' unless(@work_layers);
}
else {
@work_layers = @work_layers;
}
return @work_layers;
}
sub _deleteLayer{
my %par = @_;
foreach my $layer(@{$par{layer}}){
$GEN->deleteLayer(layer=>$layer) if ($GEN->isLayerExists(job=>$Job,layer=>$layer));
}
}
__END__
=head
NAME:
DESCRIPTION:
PARAMETER:
[
{
name : 'step_filter',
title : '工作step',
type : 'LineEdit',
property : {tool_tip : '过滤Step名称'},
},
{
name : 'units',
title : '单位',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'inch',text:'INCH'},
{name:'mm',text:'MM'},
],
tool_tip:'工作单位,未设定,默认为INCH'
},
pack : {row:1,column:1},
},
{
name : 'cover_layer_suffix',
title : '文字套层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_sm',
title : '文字距离阻焊',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_smd',
title : '文字距离SMD',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_bga',
title : '文字距离bga',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'select_lyr',
title : '选择层别',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'未设定,默认为Yes'
},
pack : {row:1,column:1},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2019-05-24 Shyer
1.新需求
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 保存料号.</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<font color="#008000"><p> ● </p></font>
<p> </p>
<br>
</body></html>
=cut
use strict;
#my ($JOB,$GEN,$GUI,$DB,$JOB_ID,$PAR,$APP,$MW);
use utf8;
use Encode;
use Data::Dump 'dump';
my $Return = 'done';
my ($Job,$Step) = ($JOB,undef);
$PAR->{units} = 'inch' unless $PAR->{units};
$PAR->{del_backup} = 'no' unless $PAR->{del_backup};
$PAR->{save_job} = 'no' unless $PAR->{save_job};
$PAR->{select_lyr} = 'yes' unless($PAR->{select_lyr});
$PAR->{cover_layer_suffix} = '_cover_tl+' unless($PAR->{cover_layer_suffix});
unless($PAR->{outline_size}){
$PAR->{outline_size} = $PAR->{units} eq 'inch' ? 16 : 200;
}
my $outline = 'gko';
my %matrix;
try {
show_loading("判断是否选择料号..",0,position=>'n');
unless( $Job){
$GUI->msgbox(-icon=>'error',-text=>"请先选择料号后再执行脚本!");
return 'Cancel';
}
##
update_loading("检查料号${Job}是否存在 ,请稍候..",0,position=>'n');
unless ( $GEN->isJobExists(job=>$Job) ){
$GUI->msgbox(-icon=>'error',-text=>"料号 ${Job} 在Genesis中不存在, 请检查!");
return 'Error';
}
##
update_loading("正在打开料号${Job} ,请稍候..",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
##
update_loading("过滤工作step...",0,position=>'n');
my $ans_step = get_work_step();
return 'Cancel' if $ans_step eq 'Cancel';
##
update_loading("过滤层别...",0,position=>'n');
my @work_layers = get_work_layer();
return 'Cancel' if $work_layers[0] eq 'Cancel';
my %info = $GUI->show_form(
-title => '请手动匹配以下信息',
-showcheck => 1,-gen=>$GEN,
-defaultsize=>[500,250],
-items=>[
{
name => 'ss_to_sm',
label => '文字距离阻焊(单边)',
type => 'number',
value=>$PAR->{ss_to_sm},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
{
name => 'ss_to_smd',
label => '文字距离SMD(单边)',
type => 'number',
value=>$PAR->{ss_to_smd},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
{
name => 'ss_to_bga',
label => '文字距离BGA(单边)',
type => 'number',
value=>$PAR->{ss_to_bga},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
]
);
return 'Cancel' unless %info;
#
###
update_loading("打开${Step} ,请稍候..",0,position=>'n');
$GEN->openStep(job=>$Job,name=>$Step);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->units( type=>$PAR->{units} );
$GEN->zoomHome();
update_loading("正在制作文字套层 ,请稍候..",0,position=>'n');
foreach my $layer (@work_layers) {
my $cover_lyr = $layer.$PAR->{cover_layer_suffix} ;
my ($sm,$outer) ;
if ($matrix{$layer}{side} eq 'top') {
$sm = 'gts';
$outer = 'gtl';
$GEN->createLayer(job=>$Job,layer=>$cover_lyr,context=>'board',type=>'document',before=>$layer,delete_exists=>'yes');
}else{
$sm = 'gbs';
$outer = 'gbl';
$GEN->createLayer(job=>$Job,layer=>$cover_lyr,context=>'board',type=>'document',after=>$layer,delete_exists=>'yes');
}
if ( $GEN->isLayerExists(job=>$Job,layer=>$sm) ) {
$GEN->affectedLayer(affected=>'yes',layer=>[$sm],clear_before=>'yes');
$GEN->selectByFilter(
polarity=>'positive',
profile=>'all',
);
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$cover_lyr,invert=>'no',size=>2*$info{ss_to_sm});
}
if ( $GEN->isLayerExists(job=>$Job,layer=>$outer) ) {
$GEN->affectedLayer(affected=>'yes',layer=>[$outer],clear_before=>'yes');
$GEN->selectByFilter(
attribute=>['.smd'],
profile=>'all',
);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$cover_lyr,invert=>'no',size=>2*$info{ss_to_smd});
}
$GEN->selectByFilter(
attribute=>['.bga'],
profile=>'all',
);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$cover_lyr,invert=>'no',size=>2*$info{ss_to_bga});
}
}
if ( $GEN->isLayerExists(job=>$Job,layer=>$outline) ) {
my $outline_tmp = $outline.'_tmp_tl';
$GEN->copyLayer(source_job=>$Job,
source_step=>$Step,
source_layer=>$outline,
dest_layer=>$outline_tmp,
mode=>'replace', #append/replace
invert=>'no') ;#|'yes'
$GEN->affectedLayer(affected=>'yes',layer=>[$outline_tmp],clear_before=>'yes');
$GEN->selectByFilter(
feat_types=>'line\;arc',
polarity=>'positive',
profile=>'all',
);
$GEN->selChangeSym(symbol=>'r'.$PAR->{outline_size}) if ( $GEN->getSelectCount() > 0 );
$GEN->copyLayer(source_job=>$Job,
source_step=>$Step,
source_layer=>$outline_tmp,
dest_layer=>$cover_lyr,
mode=>'append', #append/replace
invert=>'no') ;#|'yes'
$GEN->deleteLayer(job=>$Job,layer=>[$outline_tmp],step=>$Step);
}
}
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
update_loading("程序运行完成,请检查运行结果..",0,position=>'n');
sleep(2);
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("$Job 正在保存料号,请稍候...",0,position=>'n');
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->saveJob(job=>$Job);
hide_loading();
}
unless ($GEN->{STATUS}){
return $Return;
}
else{
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
addFlowNotes(-notes=>" Genesis Error:\n ".join("\n ",@{$GEN->{STATUS}}));
return 'Error';
}
}
catch Error::Simple with {
my $error = encode("utf8",shift);
$GUI->msgbox(-icon=>'error',-text=>$error);
return 'Error';
}
finally{
};
######################################################################################
sub get_work_step {
my @steps = $GEN->getStepList(job=>$Job);
if ( @steps == 0 ) {
$GUI->msgbox(-icon=>'error',-text=>'在料号中没有Step存在,你将退出!');
return 'Cancel';
}
elsif (@steps != 0){
my @tmp_steps = grep(/$PAR->{step_filter}/,@steps);
if ( @tmp_steps == 0 ) {
$GUI->msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!');
return 'Cancel';
}
elsif (@tmp_steps == 1) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'请选择工作 Step',
-steplist=>[@tmp_steps],
-default=>[$tmp_steps[0]],
-gen=>$GEN,
-selectmode=>'single');
return 'Cancel' unless ($Step);
}
}
return undef;
}
sub isChecklistExist{
my %par = @_ ;
my @chklists = $GEN->getChecklist(job=>$par{job},step=>$par{step});
if(grep /^$par{checkklist}$/,@chklists){
return 1;
}
else{
return 0;
}
}
sub get_work_layer{
my @work_layers;
# 获取工作层
%matrix = $GEN->getMatrix(job=>$Job,type=>'hash');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq 'board' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq 'silk_screen' ){
push @work_layers,$layer;
}
}
}
#
my %tmp_matrix;
foreach my $layer (@work_layers) {
$tmp_matrix{$layer} = $matrix{$layer};
}
##
if (@work_layers > 1 and $PAR->{select_lyr} eq 'yes') {
@work_layers = $GUI->select_layer(
-title=>'请选择工作层别',
-layermatrix=>\%tmp_matrix,
-selectmode => 'multiple');#single
return 'Cancel' unless(@work_layers);
}
else {
@work_layers = @work_layers;
}
return @work_layers;
}
__END__
=head
NAME:
DESCRIPTION: 放大文字框
PARAMETER:
[
{
name : 'step_filter',
title : '工作Step',
type : 'LineEdit',
property:{tool_tip:''}
},
{
name : 'sm_ref',
title : '防焊参考层后缀',
type : 'LineEdit',
property:{tool_tip:'如未设置,则默认为:-ref'},
},
{
name : 'is_select_lyr',
type : 'RadioBox',
title : '是否选择层别',
property : {tool_tip:'未设定,则默认no',
size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'del_backup',
type : 'RadioBox',
title : '删除TL备份层',
property : {tool_tip:'未设定,则默认yes',size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'Yes',text:'Yes'},
{name:'No',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2019-6-28 Shyer
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 文字框放大 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<font color="#008000"><p> ● 无</p></font>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
=cut
use strict;
use Encode;
use utf8;
use Data::Dump 'dump';
my ($Job,$Step) = ($JOB,undef);
$PAR->{step_filter} = '.*' unless $PAR->{step_filter};
$PAR->{is_select_lyr} = $PAR->{is_select_lyr} || 'no';
$PAR->{del_backup} = 'yes' unless $PAR->{del_backup};
$PAR->{sm_ref} = '-ref' unless $PAR->{sm_ref};
$PAR->{save_job} = 'No' unless $PAR->{save_job};
my $Return = 'done';
my $units = 'inch';
$PAR->{crate_tmp} = 'yes' unless $PAR->{crate_tmp};
$PAR->{tol} = 1;
try {
##
show_loading("判断是否选择料号..",0,position=>'n');
unless( $Job){
$GUI->msgbox(-icon=>'error',-text=>"请先选择料号后再执行脚本!");
return 'Cancel';
}
update_loading("检查${Job}是否存在..",0,position=>'n');
##检查料号是否存在
unless ( $GEN->isJobExists(job=>$Job) ){
$GUI->msgbox(-icon=>'error',-text=>"料号 $Job 不存在,请确认。");
return 'Cancel';
}
update_loading("正在打开料号$Job...",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
###选择工作step
update_loading("过滤工作step...",0,position=>'n');
my @steps = $GEN->getStepList(job=>$Job);
if ( @steps == 0 ) {
$GUI->msgbox(-icon=>'error',-text=>'在料号中没有Step存在,你将退出!');
return 0;
}
elsif (@steps != 1){
my @tmp_steps = grep(/$PAR->{step_filter}/,@steps);
if ( @tmp_steps == 0 ) {
$GUI->msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!');
return 'Cancel';
}
elsif ( @tmp_steps == 1 ) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'请选择工作Step',
-steplist=>[@tmp_steps],
-selectmode=>'single');
return 'Cancel' unless ($Step);
}
}
else {
$Step = $steps[0];
}
$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=>$units );
$GEN->zoomHome();
##过滤 board layers
update_loading("过滤工作层...",0,position=>'n');
my @work_layers = get_work_layer();
return 'Cancel' if $work_layers[0] eq 'Cancel';
##创建辅助层
$PAR->{crate_tmp} = 'no';
if( $PAR->{crate_tmp} =~ /yes/i ){
update_loading("正在创建文字层对应的防焊参考层,请稍候...",0,position=>'n');
foreach my $layer(@work_layers){
my $sm_layer = $layer =~ /gto/ ? 'gts' : 'gbs';
my $ref_layer = $layer.$PAR->{sm_ref};
next unless ( $GEN->isLayerExists(job=>$Job,layer=>$sm_layer) );
$GEN->createLayer(job=>$Job,layer=>$ref_layer,context=>'misc',type=>'document',before=>$layer) unless( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$sm_layer,dest_layer=>$ref_layer,mode=>'replace',invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$ref_layer],clear_before=>'yes');
$GEN->selContourize();
$GEN->COM('sel_resize',size=>10,corner_ctl=>'no');
}
}
foreach my $layer(@work_layers){
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$layer,dest_layer=>$layer.'_tl+++',mode=>'replace',invert=>'no');
}
# 开始放大文字框
my $default_layer = $work_layers[0];
my $ref_layer = $default_layer.$PAR->{sm_ref};
##
my ($tmp1,$tmp2) = ('tl_script_tmp1','tl_script_tmp2');
##
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
$GEN->workLayer(name=>$default_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2);
my %info;
$info{type} = 'silk_frame';
$info{scale_type} = 'scale';
$info{x} = $info{y} = 1.05;
$info{text_x} = $info{text_y} = 1.05;
$info{text_space} = 10;
$default_layer = enlarge_slik_frame(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $default_layer if $default_layer eq 'Cancel';
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
if ($PAR->{del_backup} eq 'yes'){
foreach my $layer(@work_layers){
$GEN->deleteLayer(job=>$Job,layer=>[$layer.'_tl+++']) ;
}
}
$GEN->COM( "sel_single_feat,operation=select,x=-10,y=-10,cyclic=no ");
$GEN->affectedLayer(mode=>'all',affected=>'no');
update_loading("【 放大文字框 】完成..",1,position=>'n');
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("$Job 正在保存料号,请稍候...",0,position=>'n');
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->saveJob(job=>$Job);
hide_loading();
}
unless ($GEN->{STATUS}){
return $Return;
}
else{
$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
#addFlowNotes(-notes=>" Genesis Error:\n ".join("\n ",@{$GEN->{STATUS}}));
return 'Error';
}
}
catch Error::Simple with {
my $error = shift;
$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>$error);
return 'Error';
}
finally{
$GEN->COM('disp_on');
};
sub get_work_layer{
my %par = @_;
update_loading("过滤层别...",0,position=>'n');
my @silk;
# 获取工作层
my %matrix = $GEN->getMatrix(job=>$Job,type=>'hash');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq 'board' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq 'silk_screen' ){
push @silk,$layer;
}
}
}
unless( @silk ){
$GUI->msgbox(-icon=>'warning',-text=>'资料中无文字层,请确认');
return 'Cancel';
}
if ($PAR->{is_select_lyr} eq 'yes' and scalar @silk > 1) {
my (%tmp_matrix);
foreach my $layer (@silk) {
$tmp_matrix{$layer} = $matrix{$layer};
}
@silk = $GUI->select_layer(
-title=>'请选择工作层别',
-layermatrix=>\%tmp_matrix,
-selectmode => 'multiple');#single
return 'Cancel' unless(@silk);
}
return @silk;
}
sub enlarge_slik_frame{
my %par = @_;
my $default_layer = $par{default_layer};
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
my $ref_pad = 'tmp_ref_pad';
unless ( $GEN->isLayerExists(job=>$Job,layer=>$ref_pad) ) {
$GEN->createLayer(job=>$Job,layer=>$ref_pad,context=>'misc',type=>'document');
}
while(1){
#$GEN->affectedLayer(affected=>'yes',layer=>[$tmp1,$tmp2],clear_before=>'yes');
#$GEN->selDelete();
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Work Layer');
return 'Cancel' unless $ans eq 'OK';
}
}
$ref_layer = $work_layer.$PAR->{sm_ref};
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
update_loading("请选择需放大的文字框,不需制作了请【左键框选空白处】",0,position=>'n');
my %tmp_con;
#if($info{scale_type} eq 'scale'){
# %tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select! Scale x:$info{x} y:$info{y}");
#}
#else{
# %tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select! Space x:$info{value_x} mil y:$info{value_y} mil");
#}
%tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select");
$GEN->COM('disp_off');
$work_layer = $GEN->getWorkLayer();
$ref_layer = $work_layer.$PAR->{sm_ref};
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'warning',-text=>'没有设定工作层,程序无法继续下去!');
return 'Cancel';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$tmp1,invert=>'no');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->selectByFilter(area_rect=>\%tmp_con);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$tmp1,invert=>'no');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
$default_layer = $GEN->getWorkLayer();
last;
}
}
#$GEN->COM('disp_off');
$GEN->units( type=>$units );
##获取涨缩信息
my $text_tmp = 'tl_tmp_text';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$text_tmp,mode=>'replace',invert=>'no');
#$GEN->affectedLayer(affected=>'yes',layer=>[$text_tmp],clear_before=>'yes');
#$GEN->selectByFilter(feat_types=>'line\;arc',polarity=>'positive',profile=>'all');
#$GEN->COM('sel_change_sym', symbol => 'r0')if ( $GEN->getSelectCount() > 0 );
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$text_tmp,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley);
#if( $info{scale_type} eq 'scale' ){
# $scalex = $info{x};
# $scaley = $info{y};
#}
#else{
# #my $new_limits;
# #$new_limits->{xsize} = $layer_limits->{xsize}+($info{value_x}/1000)*2;
# #$new_limits->{ysize} = $layer_limits->{ysize}+($info{value_y}/1000)*2;
# #$scalex = $new_limits->{xsize}/$layer_limits->{xsize};
# #$scaley = $new_limits->{ysize}/$layer_limits->{ysize};
# $scalex = 1 + ($info{value_x}*2)/($layer_limits->{xsize}*1000);
# $scaley = 1 + ($info{value_y}*2)/($layer_limits->{ysize}*1000);
#}
##自动计算放大比例
unless ( $GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ref_pad) ){
$GEN->affectedLayer(affected=>'yes',layer=>[$ref_pad],clear_before=>'yes');
$GEN->selDelete();
}
#filter_area_strt (1)
#filter_area_xy,x=0.6067275591,y=3.6900447835 (1)
#filter_area_xy,x=0.6735154528,y=3.6237707677 (1)
#filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=yes (1)
$GEN->affectedLayer(affected=>'yes',layer=>[$ref_layer],clear_before=>'yes');
$GEN->selectByFilter(area_rect=>{x1=>$layer_limits->{xmin}-0.01,y1=>$layer_limits->{ymin}-0.01,x2=>$layer_limits->{xmax}+0.01,y2=>$layer_limits->{ymax}+0.01});
#$GEN->selectByFilter(area_rect=>{x1=>0,y1=>0,x2=>10,y2=>10});
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$ref_pad,invert=>'no');
my $layer_limits_pad = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$ref_pad,units=>$units);
my @feature = $GEN->getFeatures(job=>$Job,step=>$Step,layer=>$tmp1,units=>$units);
my $line_width = $feature[0]->{symbol};
$line_width =~ s/^r//;
$line_width = $line_width/1000;
$scalex = ($layer_limits_pad->{xsize}+$line_width*2+0.004)/($layer_limits->{xsize});
$scalex = 1 if $scalex < 1;
$scaley = ($layer_limits_pad->{ysize}+$line_width*2+0.004)/($layer_limits->{ysize});
$scaley = 1 if $scaley < 1;
#$GUI->debug(dump($scalex,'====',$scaley));
}
#else{
# next;
#}
##
$GEN->deleteLayer(job=>$Job,layer=>[$text_tmp]);
##
$GEN->affectedLayer(affected=>'yes',layer=>[$tmp1],clear_before=>'yes');
$GEN->selTransform(mode=>'anchor',oper=>'scale',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley) if(!$GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ref_pad));
check_alone_feature_and_chage(layer=>$tmp1,sacle_x=>$scalex,sacle_y=>$scalex);
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$work_layer,number=>2);
$GEN->displayLayer(name=>$ref_layer,number=>3)if(!$GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ref_pad));
$GEN->COM('disp_on');
update_loading("请确认扩大后文字框是否符合要求(文字框未碰到防焊时,文字框无变化)",0,position=>'n');
my $ans = $GEN->PAUSE('Please Check...');
return 'Cancel' unless $ans eq 'OK';
$GEN->COM('disp_off');
my $tmp_symbol = 'tl_script_tmp';
#$GEN->COM( "delete_entity,job=$Job,type=symbol,name=$tmp_symbol" ) if( $GEN->isSymbolExists(job=>$Job,symbol=>$tmp_symbol) );
$GEN->COM('sel_all_feat');
$GEN->COM( "sel_create_sym,symbol=$tmp_symbol,x_datum=0,y_datum=0,delete=no,fill_dx=0.1,fill_dy=0.1,attach_atr=no,retain_atr=no" );
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->selRefFeat(layers=>$tmp2,use=>'filter',mode=>'cover');
$GEN->COM( "sel_substitute,mode=substitute,symbol=$tmp_symbol,tol=$PAR->{tol},x_datum=0,y_datum=0,dcode=0" );
$GEN->selectByFilter(include_syms=>$tmp_symbol);
$GEN->selBreak()if ( $GEN->getSelectCount() > 0 );
$GEN->COM('disp_on');
$default_layer = $GEN->getWorkLayer();
$GEN->COM('truncate_layer', layer =>$tmp1);
$GEN->COM('truncate_layer', layer =>$tmp2);
$GEN->COM('disp_on');
$GEN->COM('sel_clear_feat');
if( $GEN->{STATUS} ){
#$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
$GEN->units(type=>$units);
}
$GEN->deleteLayer(job=>$Job,layer=>[$ref_pad]);
return $default_layer;
}
sub enlarge_slik_layer{
my %par = @_;
my $default_layer = $par{default_layer};
my %info = %{$par{info}};
my ($curlayer,$testlayer) = ($par{tmp1},$par{tmp2});
while(1){
update_loading("请将需要放大的文字move到一个辅助层上并设为工作层...",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Layer');
return 'Cancel' unless $ans eq 'OK';
$curlayer = $GEN->getWorkLayer();
last unless $curlayer;
unless ( $GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$curlayer) ){
$GEN->affectedLayer(affected=>'yes',layer=>[$curlayer],clear_before=>'yes');
$GEN->selCopyOther(target_layer=>$testlayer,invert=>'no',size=>$info{text_space});
}
else{
last;
}
update_loading("正在放大$curlayer 层上字符,请稍候...",0,position=>'n');
my $ref_layer = 'tl_silk_layer';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$curlayer,dest_layer=>$ref_layer,mode=>'replace',invert=>'no');
$GEN->COM('disp_off');
$GEN->units( type=>$units );
my $testlayer1 = 'tl_tmp_text';
$GEN->deleteLayer(job=>$Job,layer=>[$testlayer1]);
##获取涨缩信息
my @feature = $GEN->getFeatures(job=>$Job,step=>$Step,layer=>$testlayer,units=>$units);
foreach my $feat(@feature){
$GEN->affectedLayer(affected=>'yes',layer=>[$testlayer],clear_before=>'yes');
$GEN->COM('sel_net_feat', operation => 'select',x=>$feat->{xs},y=>$feat->{ys},tol=> '2.2');
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$testlayer1,invert=>'no');
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$testlayer1,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
$GEN->affectedLayer(affected=>'yes',layer=>[$curlayer],clear_before=>'yes');
$GEN->selRefFeat(layers=>$testlayer1,use=>'filter',mode=>'touch');
if ( $GEN->getSelectCount() > 0 ){
$GEN->selTransform(mode=>'anchor',oper=>'scale',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$info{text_x},y_scale=>$info{text_y});
}
$GEN->COM('truncate_layer', layer =>$testlayer1);
}
}
$GEN->COM('truncate_layer', layer =>$testlayer);
$GEN->deleteLayer(job=>$Job,layer=>[$testlayer1]);
$default_layer = $curlayer;
$GEN->COM('disp_on');
$GEN->workLayer(name=>$curlayer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2);
update_loading("请确认$curlayer 文字放大结果并制作到正式文字层...",0,position=>'n');
$ans = $GEN->PAUSE('Please Check');
return 'Cancel' unless $ans eq 'OK';
#$GEN->COM('truncate_layer', layer =>$curlayer);
$GEN->deleteLayer(job=>$Job,layer=>[$ref_layer]);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
if( $GEN->{STATUS} ){
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
$GEN->units(type=>$units);
}
return undef;
}
sub enlarge_text_single{
my %par = @_;
my $default_layer = $par{default_layer};
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
while(1){
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$default_layer = undef;
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'n');
my $ans = $GEN->PAUSE('Please Set Work Layer');
return 'Cancel' unless $ans eq 'OK';
}
}
$ref_layer = $work_layer.'_tl+++';
$GEN->displayLayer(name=>$ref_layer,number=>2);
update_loading("请选择需按当前比例放大的字符,不需制作了请【左键框选空白处】",0,position=>'n');
my %tmp_con = $GEN->MOUSE(type=>'r',text=>"Please Select! Scale x:$info{text_x} y:$info{text_y}");
$work_layer = $GEN->getWorkLayer();
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'warning',-text=>'没有设定工作层,程序无法继续下去!');
return 'Cancel';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$tmp1,invert=>'no');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->selectByFilter(area_rect=>\%tmp_con);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$tmp1,invert=>'no');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'replace',invert=>'no');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$ref_layer,number=>2);
$default_layer = $GEN->getWorkLayer();
last;
}
}
$GEN->COM('disp_off');
$GEN->units( type=>$units );
##获取涨缩信息
$GEN->affectedLayer(affected=>'yes',layer=>[$tmp1],clear_before=>'yes');
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$tmp1,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley) = ($info{text_x},$info{text_y});
##
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'yes');
$GEN->selTransform(mode=>'anchor',oper=>'scale',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley);
$GEN->selMoveOther(target_layer=>$work_layer,invert=>'no');
$default_layer = $work_layer;
$GEN->COM('truncate_layer', layer =>$tmp1);
$GEN->COM('disp_on');
if( $GEN->{STATUS} ){
$GEN->COM('disp_on');
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
$GEN->units(type=>$units);
}
return $default_layer;
}
sub check_alone_feature_and_chage{
#检查是否含单根线
my %tmp = @_;
my $layer = $tmp{layer};
my $tmp = 'tl-'.$layer.'tmp1++';
my $tmp2 = 'tl-'.$layer.'tmp2++';
my $tmp3 = 'tl-'.$layer.'-alone';
my $cale_x = $tmp{sacle_x}||1;
my $cale_y = $tmp{sacle_y}||1;
$GEN->createLayer(job=>$Job,layer=>$tmp,context=>'misc',type=>'document',delete_exists=>'yes');
$GEN->createLayer(job=>$Job,layer=>$tmp3,context=>'misc',type=>'document',delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$tmp,invert=>'no');
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>$tmp,clear_before=>'yes');
$GEN->selContourize();
$GEN->DO_INFO("-t layer -e $Job/$Step/$tmp -d FEAT_HIST");
if ($GEN->{doinfo}{gFEAT_HISTsurf} > 0) {
for(my $i=1;$i <= $GEN->{doinfo}{gFEAT_HISTsurf};$i++){
$GEN->createLayer(job=>$Job,layer=>$tmp2,context=>'misc',type=>'document',delete_exists=>'yes');
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>$tmp,clear_before=>'yes');
$GEN->COM('sel_layer_feat',operation=>'select',layer=>$tmp,index=>$i);
$GEN->selCopyOther(target_layer=>$tmp2,invert=>'no');
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>$tmp2,clear_before=>'yes');
$GEN->COM('sel_surf2outline',width=>1);
$GEN->COM('filter_reset',filter_name=>'popup');
$GEN->selectByFilter(feat_types=>'arc',polarity=>'positive',profile=>'all');
$GEN->selDelete() if $GEN->getSelectCount() > 0 ;#--->删掉圆弧
my @feat = $GEN->getFeatures(job=>$Job,step=>$Step,layer=>$tmp2);
my %hash;
for(my $i=0;$i < @feat;$i++){
for(my $k = $i+1;$k < @feat; $k++){
if (($feat[$i]->{xs} eq $feat[$k]->{xs} && $feat[$i]->{ys} eq $feat[$k]->{ys}) ||
($feat[$i]->{xs} eq $feat[$k]->{xe} && $feat[$i]->{ys} eq $feat[$k]->{ye}) ){
$hash{$i.'star'}{x} = $feat[$i]->{xs};
$hash{$i.'star'}{y} = $feat[$i]->{ys};
}
if (($feat[$i]->{xe} eq $feat[$k]->{xs} && $feat[$i]->{ye} eq $feat[$k]->{ys}) ||
($feat[$i]->{xe} eq $feat[$k]->{xe} && $feat[$i]->{ye} eq $feat[$k]->{ye})) {
$hash{$i.'end'}{x} = $feat[$i]->{xe};
$hash{$i.'end'}{y} = $feat[$i]->{ye};
}
}
}
if (scalar(keys %hash) == 0) {
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>$layer,clear_before=>'yes');
$GEN->selRefFeat(layers=>$tmp2,use=>'filter',mode=>'touch');
if ( $GEN->getSelectCount() > 0 ){
$GEN->COM('sel_move_other',target_layer=>$tmp3,invert=>'no',dx=>0,dy=>0,size=>0,x_anchor=>0,y_anchor=>0,rotation=>0,mirror=>'none');
my $change_scal_x = sprintf("%.3f",1 / $cale_x);
my $change_scal_y = sprintf("%.3f",1 / $cale_y);
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>$tmp3,clear_before=>'yes');
$GEN->selTransform(mode=>'axis',oper=>'scale',x_anchor=>0,y_anchor=>0,x_scale=>$change_scal_x,y_scale=>$change_scal_y);
$GEN->COM('sel_move_other',target_layer=>$layer,invert=>'no',dx=>0,dy=>0,size=>0,x_anchor=>0,y_anchor=>0,rotation=>0,mirror=>'none');
$GEN->deleteLayer(job=>$Job,layer=>$tmp3,step=>$Step);
}
}
}
$GEN->deleteLayer(job=>$Job,layer=>$tmp2,step=>$Step);
$GEN->deleteLayer(job=>$Job,layer=>$tmp,step=>$Step);
}else{
$GEN->deleteLayer(job=>$Job,layer=>$tmp,step=>$Step);
if ($GEN->isLayerEmpty(job=>$Job,step=>$Step,layer=>$tmp3)) {
$GEN->deleteLayer(job=>$Job,layer=>$tmp3,step=>$Step);
}
}
}
__END__
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment