=head
NAME:
DESCRIPTION: 拷贝层别比对
PARAMETER:
[
{
name : 'units',
title : 'genesis units:',
type : 'ComboBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'mm',text:'mm'},
{name:'inch',text:'inch'},
],
tool_tip:'脚本运行genesis的工作单位,如未设置,默认为inch'
},
pack : {row:1,column:1},
},
{
name : 'step_filter',
type : 'LineEdit',
title : 'step过滤:',
pack : {row:0,column:1},
property:{tool_tip:'脚本参数若未设置,则手动选择'},
},
{
name : 'source_step_filter',
type : 'LineEdit',
title : '来源step过滤:',
pack : {row:0,column:1},
property:{tool_tip:'脚本参数若未设置,则手动选择'},
},
{
name : 'mode',
type : 'ComboBox',
title : '工作模式:',
property : {tool_tip:'如未设置,则默认为拷贝层',
size_policy:'Expanding,Fixed',
item_list:[
{name:'copy',text:'拷贝层'},
{name:'compare',text:'拷贝并比对层'},
]
},
pack : {row:1,column:1},
},
{
name : 'layer_type',
type : 'ComboBox',
title : '工作层别:',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'drill',text:'钻孔层'},
{name:'inner',text:'内层'},
{name:'outer',text:'外层'},
{name:'sm',text:'防焊层'},
{name:'silk',text:'文字层'},
{name:'board',text:'board层'},
{name:'all',text:'所有层'},
{name:'select',text:'选择层'},
],
tool_tip:'脚本层如未设置,默认为 board'
},
pack : {row:1,column:1},
},
{
name : 'cmp_tol',
type : 'LineEdit',
title : '比对公差:',
property:{tool_tip:'未设定,则默认为0.001inch,具体单位参考 units'},
},
{
name : 'map_layer_res',
type : 'LineEdit',
title : '对比层解析度',
property:{tool_tip:'未设定,则默认为0.150inch,具体单位参考 units'},
},
{
name : 'layer_suffix',
type : 'LineEdit',
title : '层后缀:',
pack : {row:0,column:1},
property:{tool_tip:'脚本参数若未设置,则默认:_bk'},
},
{
name : 'ignore_attr',
type : 'LineEdit',
title : '忽略属性',
pack : {row:0,column:1},
property:{tool_tip:'脚本参数若未设置,则默认:空'},
},
{
name : 'del_backup',
type : 'RadioBox',
title : self.ttr('删除备份层'),
property : {tool_tip:'未设定,则默认no',size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
validate: function(obj,val,title,moment){
print(title +' changed to <' + val + '> on ' + moment);
}
},
{
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-26 Shyer
1.新版本
HELP:
功能简介
拷贝层别比对
参数配置
● 无
注意事项
● 无
=cut
use strict;
#my ($JOB,$GEN,$GUI,$DB,$JOB_ID,$PAR,$APP,$MW);
use utf8;
use File::Spec;
use Data::Dump 'dump';
my $Return = 'done';
my $Job = $JOB;
$PAR->{mode} = 'copy' unless $PAR->{mode};
$PAR->{layer_suffix} = '_bk' unless $PAR->{layer_suffix};
$PAR->{units} = 'inch' unless $PAR->{units};
unless ($PAR->{cmp_tol}){
$PAR->{cmp_tol} = $PAR->{units} eq 'inch' ? 0.001 : 0.0254;
}
$PAR->{cmp_tol} *= 1000;
unless ($PAR->{map_layer_res}){
$PAR->{map_layer_res} = $PAR->{units} eq 'inch' ? 0.15 : 3.81;
}
$PAR->{map_layer_res} *= 1000;
$PAR->{step_filter} = '.*' unless $PAR->{step_filter};
$PAR->{layer_type} = 'board' unless $PAR->{layer_type};
$PAR->{del_backup} = 'no' unless $PAR->{del_backup};
$PAR->{save_job} = 'No' unless $PAR->{save_job};
use_module("PubFunction");
my $Func = PubFunction->new();
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("正在打开料号...",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
##
my $info = ui_confirm();
return $info if $info eq 'Cancel';
##
my $Step = $info->{step};
my $source_job = $info->{source_job};
my $source_step = $info->{source_step};
my $tol = $info->{tolerance};
my $suffix = $info->{suffix};
my @Layers = @{$info->{layers}};
$GEN->openStep(job=>$Job,name=>$Step);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->units( type=>$PAR->{units} );
$GEN->zoomHome();
my @report;
my (%info,%cmp);
if($PAR->{mode} =~ /compare/){
$info{title} = "$Step 和$source_job 的$source_step 中层别比对结果";
$info{width} = 300;
$info{columns} = [{name=>'layer',label=>'工作层'},{name=>'source_layer',label=>'比对层'},{name=>'source_step',label=>'来源step'},{name=>'result',label=>'比对结果'}];
}
my (@tmp_layers,@bk);
foreach my $item( @Layers ){
next unless $item->{target_layer};
update_loading("正在从$source_job 中的 $source_step step 的$item->{source_layer}层 拷贝到$item->{target_layer} ",0,position=>'n');
my $bk_layer = $item->{source_layer}.$suffix;
push @bk,$bk_layer;
$GEN->copyLayer(source_job=>$source_job,source_step=>$source_step,source_layer=>$item->{source_layer},dest_layer=>$bk_layer,mode=>'replace',invert=>'no') ;
#if($PAR->{mode} =~ /compare/){
# my $map_layer = 'cmp_'.$item->{target_layer};
# push @tmp_layers,($map_layer,$bk_layer);
# update_loading("$item->{target_layer} 层正在和$source_job 中的 $source_step step 的$item->{source_layer}层 ",0,position=>'n');
# my $diff = $GEN->compareLayers(
# layer1 => $item->{target_layer},job2 => $Job,step2 => $Step,layer2 => $bk_layer,layer2_ext => '',
# tol => $tol, area => 'global',ignore_attr => $PAR->{ignore_attr},map_layer => $map_layer,map_layer_res=>$PAR->{map_layer_res});
# if( $diff ){
# push @{$info{data}},{layer=>$item->{target_layer},source_layer=>$bk_layer,source_step=>$source_step,result=>'NG',result_bg=>'red'};
# $cmp{$item->{target_layer}}{source} = $item->{source_layer};
# $cmp{$item->{target_layer}}{ref} = $bk_layer;
# $cmp{$item->{target_layer}}{map} = $map_layer;
# $cmp{$item->{target_layer}}{diff} = 1;
#
# }
# else{
# push @{$info{data}},{layer=>$item->{target_layer},source_layer=>$bk_layer,source_step=>$source_step,result=>'OK',result_bg=>'green'};
# }
#}
}
if ($info->{del_nfp} eq 'yes') {
$GEN->affectedLayer(affected=>'yes',layer=>[@bk],clear_before=>'yes');
my $check_list = 'nfp';
unless ( $GEN->isChklistExists(job=>$Job,step=>$Step,chklist=>$check_list) ){
$GEN->COM('chklist_from_lib',chklist=>$check_list);
}
$GEN->COM('chklist_open',chklist=>$check_list);
$GEN->COM('chklist_show',chklist=>$check_list);
$GEN->chklistCupd(chklist=>$check_list,nact=>1,params=>{pp_layer=>'.affected',pp_drill=>'Via'}) ;
$GEN->COM('chklist_run',chklist=>$check_list,nact=>1,area=>'global');
#$GEN->COM('chklist_res_show',chklist=>$check_list,nact=>$act_num,x=>0,y=>0,w=>0,h=>0);
$GEN->COM("chklist_res_sel_category,layers_mode=replace,keep_work_lyr=no,display_mode=auto_zoom,chklist=$check_list,nact=1,category=modify_text");
}
foreach my $item( @Layers ){
next unless $item->{target_layer};
my $bk_layer = $item->{source_layer}.$suffix;
if($PAR->{mode} =~ /compare/){
my $map_layer = 'cmp_'.$item->{target_layer};
push @tmp_layers,($map_layer,$bk_layer);
update_loading("$item->{target_layer} 层正在和$source_job 中的 $source_step step 的$item->{source_layer}层 ",0,position=>'n');
my $diff = $GEN->compareLayers(
layer1 => $item->{target_layer},job2 => $Job,step2 => $Step,layer2 => $bk_layer,layer2_ext => '',
tol => $tol, area => 'global',ignore_attr => $PAR->{ignore_attr},map_layer => $map_layer,map_layer_res=>$PAR->{map_layer_res});
if( $diff ){
push @{$info{data}},{layer=>$item->{target_layer},source_layer=>$bk_layer,source_step=>$source_step,result=>'NG',result_bg=>'red'};
$cmp{$item->{target_layer}}{source} = $item->{source_layer};
$cmp{$item->{target_layer}}{ref} = $bk_layer;
$cmp{$item->{target_layer}}{map} = $map_layer;
$cmp{$item->{target_layer}}{diff} = 1;
}
else{
push @{$info{data}},{layer=>$item->{target_layer},source_layer=>$bk_layer,source_step=>$source_step,result=>'OK',result_bg=>'green'};
}
}
}
#
##确认比对结果
if($PAR->{mode} =~ /compare/i ){
foreach my $item( @Layers ){
next unless $cmp{$item->{target_layer}}{diff};
$Return = 'warning';
$GEN->workLayer(name=>$item->{target_layer},display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$cmp{$item->{target_layer}}{ref},number=>2);
$GEN->displayLayer(name=>$cmp{$item->{target_layer}}{map},number=>3);
update_loading("$item->{target_layer} 和$source_job 中的 $source_step step 的$cmp{$item->{target_layer}}{source}层比对结果不一致,请确认",0,position=>'n');
my $ans = $GEN->PAUSE('Please Check');
return 'Cancel' unless $ans eq 'OK';
}
$GEN->deleteLayer(job=>$Job,layer=>[@tmp_layers]) if $PAR->{del_backup} =~ /yes/i;
}
##解析报告格式
if( keys %info ){
push @report,$Func->format_report_data(-rows=>\%info);
##储存比对报告
if( @report ){
my $Report = join('.',@report);
$GUI->msgbox(-text=>'info',-text=>'请在制作结果中查看比对结果');
$IKM->update_flow_report(-report=>$Report,-job_id=>$ARGS{job_id},-process_id=>$ARGS{process_id});
}
else{
$IKM->update_flow_report(-report=>'',-job_id=>$ARGS{job_id},-process_id=>$ARGS{process_id});
}
}
else{
$IKM->update_flow_report(-report=>'',-job_id=>$ARGS{job_id},-process_id=>$ARGS{process_id});
}
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{
#$GEN->deleteLayer(layer=>$tmp_layer) if ($GEN->isLayerExists(job=>$Job,layer=>$tmp_layer));
};
sub _layer_bg_color{
my $it = shift;
if ($it->{context} eq 'board'){
if ($it->{layer_type} eq 'signal'){
return '#FDC74D';
}
elsif ($it->{layer_type} eq 'power_ground'){
return '#DBAD00';
}
elsif ($it->{layer_type} eq 'mixed'){
return '#F3E086';
}
elsif ($it->{layer_type} eq 'solder_mask'){
return '#00A57C';
}
elsif ($it->{layer_type} eq 'silk_screen'){
return '#FFFFFF';
}
elsif ($it->{layer_type} eq 'solder_paste'){
return '#FFFFCE';
}
elsif ($it->{layer_type} eq 'drill'){
return '#9BB5BF';
}
elsif ($it->{layer_type} eq 'rout'){
return '#D9D9D9';
}
elsif ($it->{layer_type} eq 'document'){
return '#9BDBDB';
}
}
else{
return '#9BDBDB';
}
}
sub ui_confirm{
my %par = @_;
update_loading("确认层别的拷贝和比对信息...",0,position=>'n');
my $JobList;
my @items;
push @items,(
{
name => 'job',
label => '当前料号',
type => 'job',
property => {
tl_joblist => sub{$JobList = $GEN->getJobList() unless $JobList;return $JobList},
},
value=>$Job,
sensitive =>0,
validate_func => sub{
my %par = @_;
if ($par{mode} ne 'save'){
if ($par{value} ne ''){
##
my @all_steps = $GEN->getStepList(job=>$par{value});
my @tl_data_target;
foreach my $step( @all_steps){
push @tl_data_target,{step=>$step};
}
$par{formpanel}->get_widget('step')->set_property(tl_data=>[@tl_data_target]);
##
my @step_filter = grep(/$PAR->{step_filter}/,@all_steps);
if(@step_filter){
if(scalar(@step_filter) == 1){
$par{formpanel}->set_value('step',$step_filter[0]);
}
}
##
my $source_job = $par{formpanel}->get_value('source_job');
my $source_matrix = $GEN->getMatrix(job=>$source_job);
##
$par{formpanel}->{TARGET_LAYER_MATRIX} = $GEN->getMatrix(job=>$par{value});
my $matrix = $par{formpanel}->{TARGET_LAYER_MATRIX};
my @layer_default;
foreach my $layer(sort {$matrix->{$a}{row} <=> $matrix->{$b}{row}} keys %{$matrix} ) {
if( $PAR->{layer_type} =~ /board/ ){
if( defined $matrix->{$layer}{context} and $matrix->{$layer}{context} eq 'board' ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
}
elsif( $PAR->{layer_type} =~ /all/ ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
elsif( $PAR->{layer_type} =~ /drill/ ){
if( $matrix->{$layer}{context} eq 'board' and $matrix->{$layer}{layer_type} eq 'drill' ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
}
elsif( $PAR->{layer_type} =~ /inner/ ){
if( $matrix->{$layer}{context} eq 'board' and $matrix->{$layer}{tl_type} eq 'inner' ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
}
elsif( $PAR->{layer_type} =~ /outer/ ){
if( $matrix->{$layer}{context} eq 'board' and $matrix->{$layer}{tl_type} eq 'outer' ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
}
elsif( $PAR->{layer_type} =~ /sm/ ){
if( $matrix->{$layer}{context} eq 'board' and $matrix->{$layer}{tl_type} eq 'solder_mask' ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
}
elsif( $PAR->{layer_type} =~ /silk/ ){
if( $matrix->{$layer}{context} eq 'board' and $matrix->{$layer}{tl_type} eq 'silk_screen' ){
if( $source_matrix->{$layer} ){
push @layer_default,{target_layer=>$layer,source_layer=>$layer};
}
else{
push @layer_default,{target_layer=>$layer};
}
}
}
}
if( @layer_default ){
$par{formpanel}->set_value('layers',\@layer_default);
}
else{
$par{formpanel}->set_value('layers',[{target_layer=>''}]);
}
$par{formpanel}->{TARGET_LAYER_MATRIX} = $GEN->getMatrix(job=>$par{value});
}
else{
$par{formpanel}->{TARGET_LAYER_MATRIX} = undef;
}
}
if ($par{value} eq ''){
return {error_msg=>'当前料号不能为空!'}
}
return {};
},
pre_func => sub{
my %par = @_;
$par{formpanel}->{TARGET_LAYER_MATRIX} = $GEN->getMatrix(job=>$Job);
}
},
{
name => 'source_job',
label => '来源料号',
type => 'job',
property => {
tl_joblist => sub{$JobList = $GEN->getJobList() unless $JobList;return $JobList},
},
value=>$Job,
validate_func => sub{
my %par = @_;
my $work_job = $par{formpanel}->get_value('source_job');
if ($par{mode} ne 'save'){
if ($par{value} ne ''){
my @all_steps = $GEN->getStepList(job=>$par{value});
my @tl_data_source;
foreach my $step( @all_steps){
push @tl_data_source,{step=>$step};
}
$par{formpanel}->get_widget('source_step')->set_property(tl_data=>[@tl_data_source]);
##
my @step_filter = grep(/$PAR->{source_step_filter}/,@all_steps);
if(@step_filter){
if(scalar(@step_filter) == 1){
$par{formpanel}->set_value('source_step',$step_filter[0]);
}
}
##
my $layers = $par{formpanel}->get_value('layers');
my $source_matrix = $GEN->getMatrix(job=>$work_job);
my @layer_default;
foreach my $item(@$layers){
if( $item->{target_layer} and $item->{source_layer} and $item->{target_layer} ne $item->{source_layer} ){
push @layer_default,{target_layer=>$item->{target_layer},source_layer=>$item->{source_layer}};
}
elsif( $source_matrix->{$item->{target_layer}} ){
push @layer_default,{target_layer=>$item->{target_layer},source_layer=>$item->{target_layer}};
}
else{
push @layer_default,{target_layer=>$item->{target_layer}};
}
}
if( @layer_default ){
$par{formpanel}->set_value('layers',\@layer_default);
}
##
$par{formpanel}->{SOURCE_LAYER_MATRIX} = $GEN->getMatrix(job=>$par{value});
}
else{
$par{formpanel}->{SOURCE_LAYER_MATRIX} = undef;
}
}
if ($par{value} eq ''){
return {error_msg=>'目标料号不能为空!'}
}
return {};
},
pre_func => sub{
my %par = @_;
$par{formpanel}->{SOURCE_LAYER_MATRIX} = $GEN->getMatrix(job=>$Job);
}
},
);
push @items,(
{
name => "step",
label => '工作Step',
type => 'enum',
property => {
tl_field => ['step'=>'text'],
tl_value_field => 'step',
#tl_data=>\@tl_data_source,
},
validate_func => sub{
my %par = @_;
if ($par{value} eq ''){
return {error_msg=>'工作Step不能为空!'}
}
return {};
}
},
{
name => "source_step",
label => '来源Step',
type => 'enum',
value=>'',
property => {
tl_field => ['step'=>'text'],
tl_value_field => 'step',
#tl_data=>\@tl_data_dest,
},
validate_func => sub{
my %par = @_;
if ($par{value} eq ''){
return {error_msg=>'来源Step不能为空!'}
}
return {};
}
},
);
push @items,(
{
name=>'tolerance',
label=>'比对精度',
type=>'number',
value=>$PAR->{cmp_tol},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
must_field=>1,
},
{
name=>'suffix',
label=>'后缀名',
value=>$PAR->{layer_suffix},
must_field=>1,
},
{
name => 'layers',
label_position => 'top',
button_position => 'top',
type => 'treeview',
property => {
tl_mapping =>['source_layer'=>'Glib::String','source_bg_color' => 'Glib::String','target_layer'=>'Glib::String','target_bg_color'=>'Glib::String'],
tl_columns =>[{title => '当前层', visible => 1, resizable => 1,reorderable=>1,min_width=>50,expand=>1, renders => [{class=>'Text',text=>'target_layer','cell-background'=>'target_bg_color'}]},
{title => '来源层', visible => 1, resizable => 1,reorderable=>1,min_width=>50,expand=>1, renders => [{class=>'Text',text=>'source_layer','cell-background'=>'source_bg_color'}]},
],
tl_model_type=>'list',
can_focus=>1,
enable_grid_lines=>'both',
tl_selection_mode=>'multiple',
},
expand => 1,
col_span => 2,
scrolledwindow=>{},
get_value_func=>sub{my %par = @_; return $par{widget}->tl_get_model_data();},
set_value_func=>sub{
my %par = @_;
my $source_matrix = $par{formpanel}->{SOURCE_LAYER_MATRIX};
my $target_matrix = $par{formpanel}->{TARGET_LAYER_MATRIX};
foreach my $item (@{$par{value}}){
my $source_layer = $source_matrix->{$item->{source_layer}};
my $target_layer = $target_matrix->{$item->{target_layer}};
$item->{source_bg_color} = _layer_bg_color($source_layer);
if ($target_layer){
$item->{target_bg_color} = _layer_bg_color($target_layer);
}
}
#print dump(\$par{value})," ===\n";
$par{widget}->tl_set_data($par{value});
},
#value=>[{source_layer=>'lyr1',target_layer=>'lyr1'},],
buttons => [
{ name => 'add_layer', stock=>'gtk-add',label=>'添加层别',relief=>'none',command=>sub{
my %par = @_;
my $source_job = $par{formpanel}->get_value('source_job');
my $target_job = $par{formpanel}->get_value('job');
if ($source_job eq ''){
$GUI->msgbox(-icon=>'error',-text=>'请设定来源料号');
return;
}
if ($target_job eq ''){
$GUI->msgbox(-icon=>'error',-text=>'请设定工作料号');
return;
}
my $target_matrix = $par{formpanel}->{TARGET_LAYER_MATRIX};
my @layers = $GUI->select_layer(-title=>'选择层别',-layermatrix=>$target_matrix);
return unless @layers;
my $source_matrix = $par{formpanel}->{SOURCE_LAYER_MATRIX};
my @trv_layers;
my $layres = $par{formpanel}->get_value('layers');
foreach my $layer (@layers){
my $layer_exist;
foreach my $item(@$layres){
$layer_exist = 1 if $item->{target_layer} eq $layer;
last if $layer_exist;
}
next if $layer_exist;
my $source_layer = $source_matrix->{$layer};
my $target_layer = $target_matrix->{$layer};
my $tmp = {source_layer => $layer};
$tmp->{source_bg_color} = _layer_bg_color($source_layer);
if ($target_layer){
$tmp->{target_layer} = $layer;
$tmp->{target_bg_color} = _layer_bg_color($target_layer);
}
push @trv_layers,$tmp;
}
##
$par{formpanel}->get_widget('layers')->tl_append_data(\@trv_layers);
return 0;
}
},
{ name => 'remove_layer', stock=>'gtk-remove',label=>'移除层别',relief=>'none',command=>sub{
my %par = @_;
$par{formpanel}->get_widget('layers')->tl_sel_remove();
}},
],
pre_func => sub{
my %par = @_;
$par{widget}->signal_connect('row_activated' => sub{
my ($lyr) = $par{widget}->tl_get_selection();
return unless $lyr->{target_layer};
my $layer = $GUI->select_layer(
-title => '设定'.$lyr->{target_layer}.'的来源层',
-layermatrix => $par{formpanel}->{SOURCE_LAYER_MATRIX},
-selectmode => 'single',
);
return unless defined $layer;
my $target_bg_color = _layer_bg_color($par{formpanel}->{SOURCE_LAYER_MATRIX}{$layer});
$par{widget}->tl_change_sel_data([{source_layer=>$layer,source_bg_color=>$target_bg_color}],0);
});
},
validate_func => sub{
my %par = @_;
my @err;
return {error_msg=>'请选择比对层别'} unless (@{$par{value}});
my $ok;
foreach my $item (@{$par{value}}){
next unless $item->{target_layer};
if (!defined $item->{source_layer} or $item->{source_layer} eq ''){
push @err, $item->{target_layer}.'层对应的来源层不能为空!';
}
else{
$ok = 1;
}
}
unless($ok){
push @err, '必须添加拷贝层别!';
}
if (@err){
return {error_msg=>join("\n",@err)};
}
else{
return {};
}
}
},
{
name => 'del_nfp',
label=> '删除无功能pad',
type=>'radio',
value => 'no',
property=>{tl_columns => 2,
tl_list=>['yes' => '是',
'no' => '否']
},
},
);
my %vform = $GUI->show_form(
-title => '信息确认',
-defaultsize => [600,500],
-columns => 2,
-items =>\@items,
);
return 'Cancel' unless %vform;
return \%vform;
}
__END__