=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:
功能简介
保存料号.
参数配置
●
=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__