=head
NAME: ZWZ_Merge_Layer
DESCRIPTION: 复合层铜皮整理
PARAMETER:
[
{
name : 'step_filter',
type : 'LineEdit',
title : 'step过滤',
pack : {row:0,column:1},
property:{tool_tip:'选择step时候的过滤器'},
},
{
name : 'bak_layer_suf',
type : 'LineEdit',
title : '备份层后缀',
pack : {row:0,column:1},
property:{tool_tip:'去铜丝参数'},
}
]
VERSION_HISTORY:
V1.00 2020-10-30 Super
1.新版本
HELP:
功能简介
DFM优化
参数配置
● 无
注意事项
● 无
=cut
use strict;
use utf8;
use Data::Dump 'dump';
my ($Job,$Step)=($JOB,undef);
my $Report = 'done';
my @work_layers;
$PAR->{bak_layer_suf} = $PAR->{bak_layer_suf} ? $PAR->{bak_layer_suf} : '++--merge+layer++';
try {
###检查Genesis料号是否存在并打开
show_loading("检查${Job}是否存在..",0,position=>'n');
if (! $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));
my @steps = $GEN->getStepList(job=>$Job);
if ( @steps == 0 ) {
$GUI->msgbox(-icon=>'error',-text=>'在料号中没有Step存在,你将退出!');
return 'Error';
}
elsif (@steps != 1){
my $srep_filter = $PAR->{step_filter} ? $PAR->{step_filter} : '.*';
my @tmp_steps = grep(/$srep_filter/,@steps);
if ( @tmp_steps == 0 ) {
$GUI->msgbox(-icon=>'error',-text=>'在料号中没有过滤器中的step存在,你将退出!');
return 'Error';
}
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];
}
##
update_loading("过滤层别...",0,position=>'n');
@work_layers = get_work_layer();
return 'Cancel' if grep /^Cancel$/,@work_layers;
###打开step
$GEN->openStep(job=>$Job,name=>$Step);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->COM( "sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
$GEN->units(type=>'inch');
$GEN->zoomHome();
$GEN->COM("disp_off");
foreach my $layer (@work_layers){
update_loading("$layer 复合层整理中...",0,position=>'n');
next if ($GEN->isLayerEmpty(job=>$Job,step=>$Step,layer=>$layer));
my $bak_layer = $layer.$PAR->{bak_layer_suf};
my $dest_suffix = '__tl__';
$GEN->createLayer(job=>$Job,layer=>$bak_layer,context=>'misc',type=>'document',delete_exists=>'yes');
$GEN->affectedLayer(affected=>'yes',layer=>$layer,clear_before=>'yes');
#1.分解复合层
$GEN->COM('unmerge_layer',layer=>$layer,dest_suffix=>$dest_suffix,dest_max_layers=>1000);
$GEN->selMoveOther(target_layer=>$bak_layer,invert=>'no');
#2.获取复合层名
my %matrix = $GEN->getMatrix(job=>$Job,type=>'hash');
my $exp = $layer.$dest_suffix;
my @merge_layer = grep(/($exp)/,sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix);
if(@merge_layer){
foreach my $tmp_layer (@merge_layer){
$GEN->affectedLayer(affected=>'yes',layer=>$tmp_layer,clear_before=>'yes');
my $check = substr($tmp_layer,-1);
if($check =~ /^p$/){
$GEN->selMoveOther(target_layer=>$layer,invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>$layer,clear_before=>'yes');
$GEN->selectByFilter(polarity=>'negative',profile=>'all');
next unless ($GEN->getSelectCount());
$GEN->selClearFeature();
$GEN->selectByFilter(feat_types=>'surface',polarity=>'positive',profile=>'all');
next unless ($GEN->getSelectCount());
$GEN->selectByFilter(polarity=>'negative',profile=>'all');
$GEN->selContourize() if ( $GEN->getSelectCount() > 0 );
}else{
$GEN->selMoveOther(target_layer=>$layer,invert=>'yes');
$GEN->affectedLayer(affected=>'yes',layer=>$layer,clear_before=>'yes');
$GEN->selectByFilter(feat_types=>'surface',polarity=>'positive',profile=>'all');
next unless ($GEN->getSelectCount());
$GEN->selectByFilter(polarity=>'negative',profile=>'all');
$GEN->selContourize() if ( $GEN->getSelectCount() > 0 );
}
}
$GEN->deleteLayer(job=>$Job,layer=>[@merge_layer]);
}else{
next;
}
}
$GUI->msgbox(-icon=>'info',-text=>'脚本运行完成请仔细检查!');
###output and return status, if genesis error, it will output genesis error command
unless ($GEN->{STATUS}){
return $Report;
}
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 = shift;
$GUI->msgbox(-icon=>'error',-text=>$error);
return 'Error';
}
finally{
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->COM("disp_on");
};
=head
选择线路层
=cut
sub get_work_layer{
# 获取工作层
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 'outer' or $matrix{$layer}{tl_type} eq 'inner')){
push @work_layers,$layer;
}
}
}
my %tmp_matrix;
foreach my $layer (@work_layers) {
$tmp_matrix{$layer} = $matrix{$layer};
}
if (@work_layers > 1) {
@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;
}