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