=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__