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