// 获取涨缩值 function get_scale_info(par){ var rows={},n=0; par.layers.forEach(function(layer){ n ++; rows[layer].sequence = n; rows[layer].layer = layer; if(layer == "md"){ rows[layer].x = 1.0004; rows[layer].y = 1.0004; } else{ rows[layer].x = 1.0000; rows[layer].y = 1.0000; } }) var scale_factor = GUI.show_tableform({ defaultsize:[380,400],title : '请确认涨缩值',rows : rows, showcheck : 1,gen : $GEN, columns : [ { column_name:'layer', label:'层名称', width:70, type:'label', }, { column_name:'x', label:'X涨缩值', width:130, type:'number', }, { column_name:'y', label:'Y涨缩值', width:130, type:'number', }, ], }); return scale_factor || "Cancel"; } // drillmarge 输出 function drill_out(par){ var nc_set = 'sec-jt'; var ncsets = GEN.getNcsetsList({job:job,step:step,layer:par.layer}); if( ncsets.length > 0 ){ if (ncsets.filter(function(v){return /^($nc_set)$/.test(v)}).length > 0) { GEN.COM('ncset_delete',{name:nc_set}); } } // 钻带涨缩中心点 var x_anchor = (par.scale_x != 1 || par.scale_y != 1) ? PAR.profile_limits.xc : 0; var y_anchor = (par.scale_x != 1 || par.scale_y != 1) ? PAR.profile_limits.yc : 0; if(fstat.exist(PAR.out_dir+'/'+par.output_layer)){ //? unlink }; var org_x,org_y,angle; if(PAR.profile_limits.ysize == 603 && PAR.profile_limits.xsize == 706){ org_x = PAR.profile_limits.yc; // - 15 org_y = 5; angle = 270; datum.x = PAR.profile_limits.xmax - 5; datum.y = PAR.profile_limits.yc; datum.angle = 90; datum.type = 1; // 拼版类型 }else if(PAR.profile_limits.ysize == 603 && PAR.profile_limits.xsize == 606){ datum.x = org_x = PAR.profile_limits.xc;//- 5 datum.y = org_y = 5; datum.angle = angle = 0; datum.type = 0; // 拼版类型 }else{ datum.x = org_x = PAR.profile_limits.xc;//- 24 datum.y = org_y = 5; datum.angle = angle = 0; datum.type = 0; // 拼版类型 } // 铝片塞防焊和铝片塞树脂程序,bot面时需要mirror var xmirror = 'no'; var ymirror = 'no'; if (/al[pr](\d\d)(\d\d)/.test(par.layer)) { var start = RegExp.$1 + 0; var end = RegExp.$2 + 0; if (start > end) { xmirror = 'yes'; } } // 获取@drl_section_data数据 if( /(cdr)/.test(par.layer) && GEN.getLayerCount({job:job}) >= 4){ var feat = GEN.getFeatures({job:job,step:step,layer:'pnl-map',units:'mm'}); var data_tmp = feat.filter(function(v){return /(DRL_SECTION)/.test(v.attributes[0])});//获取监视孔坐标 section_tool = map_info.P.min_drl >= 1100 ? 1100 : map_info.P.min_drl; drl_section_data = genMath.p_trans(datum,datum.angle,'no',-datum.x,-datum.y,data_tmp); // if($datum->{angle} == 90){ // my @data_tmp = TL::GenMath->p_trans($datum,$datum->{angle},'no',0,0,@data_tmp);#坐标选择 // foreach my $data (@data_tmp){ // my $coorder_txt; // $coorder_txt = change_coode(data=>$data,datum=>$datum); // $drl_section_data->{$coorder_txt} = 1; // } // }else{ // foreach my $data (@data_tmp){ // my $coorder_txt; // $coorder_txt = change_coode(data=>{x=>$data->{x},y=>},datum=>$datum); // $drl_section_data->{$coorder_txt} = 1; // } // } } var id = nc_set; GEN.COM('ncset_units',{units:'mm'}); if(/(cdr)/.test(par.layer)){ GEN.affectedLayer({affected:'yes',layer:par.layer,clear_before:'yes'}); GEN.COM("adv_filter_reset"); GEN.COM("reset_filter_criteria,filter_name=,criteria=all"); GEN.selectByFilter({attribute:[{attribute:'tl_string',text:"*LDI_HOLE_Two*"}]}); GEN.selectByFilter({attribute:[{attribute:'tl_string',text:"*XRAY_HOLE*"}]}); GEN.COM("adv_filter_reset"); GEN.COM("reset_filter_criteria,filter_name=,criteria=all"); if( GEN.getSelectCount()>0){ GEN.selChangeSym({symbol:'r1'}) }; GEN.affectedLayer( {mode:'all',affected:'no'} ); } // GEN.COM('open_sets_manager',test_current=>'no'); GEN.COM('nc_create',{ncset:id,device:'basic_excellon',lyrs:par.layer,thickness:0}); GEN.COM('nc_set_advanced_params',{layer:par.layer,ncset:id}); GEN.COM('nc_set_current',{job:job,step:step,layer:par.layer,ncset:id}); GEN.COM('nc_set_file_params',{single_sr:'no',output_path:PAR.out_dir,output_name:par.output_layer,zeroes:'none',units:'mm',tool_units:'mm',nf1:3,nf2:3,decimal:'no',modal_coords:'no'}); GEN.COM('nc_register',{angle:angle,xoff:0,yoff:0,version:1,xorigin:org_x,yorigin:org_y,xscale:par.scale_x,yscale:par.scale_y,xscale_o:x_anchor,yscale_o:y_anchor,xmirror:xmirror,ymirror:ymirror}); GEN.COM('nc_set_optim',{optimize:'yes',iterations:5,reduction_percent:1,cool_spread:PAR.cool_spread,break_sr:'yes',xspeed:2540,yspeed:2540,diag_mode:'45ort'}); GEN.COM('nc_cre_output',{layer:par.layer,ncset:id}); var profile = GEN.getProfileLimits({job:job,step:step,units:'mm'}); GEN.origin({x:profile.xmin,y:profile.ymin}); if(/(cdr)/.test(par.layer)){ GEN.affectedLayer({affected:'yes',layer:par.layer,clear_before:'yes'}); GEN.COM("adv_filter_reset"); GEN.COM("reset_filter_criteria,filter_name=,criteria=all"); GEN.selectByFilter({attribute:[{attribute:'tl_string',text:"*LDI_HOLE_Two*"}]}); GEN.selectByFilter({attribute:[{attribute:'tl_string',text:"*XRAY_HOLE*"}]}); GEN.COM("adv_filter_reset"); GEN.COM("reset_filter_criteria,filter_name=,criteria=all"); if( GEN.getSelectCount()>0){ GEN.selChangeSym({symbol:'r3054'}) }; GEN.affectedLayer({ mode:'all',affected:'no'}); } ncsets = GEN.getNcsetsList({job:job,step:step,layer:par.layer}); if( ncsets.length > 0 ){ if (ncsets.filter(function(v){ return /^($nc_set)$/.test(v)}).length > 0) { GEN.COM('ncset_delete',{name:nc_set}); } } } // function edit_nc_file(par){ // open(TMP,par.output_file) || die "cannot open "+par.output_file; // my @data = <TMP>; // close (TMP); // chomp @data; // # // my %data = split_program(data=>\@data); // my $ans = convert_new_program(layer=>$par{layer},new_file=>$par{new_file},data=>\%data,x=>$par{x},y=>$par{y}); // return $ans if $ans; // return undef; // } function split_program(par){ var ui_info = par.info; var info={}; var flag="start",router_flag = undefined; par.data.forEach(function(line){ if( flag == 'start' ){ if( line == 'M48' ){ flag = 'overhead'; } } else if( flag == 'overhead' ){ if( /^T01C/i.test(line) ){ flag = 'head'; } } else if( flag == 'head' ){ if( !/^T\d+/i.test(line) ){ flag = 'neck'; } } else if( flag == 'neck' ){ if( /^T01/i.test(line) ){ flag = 'body'; } } else if( flag == 'body' ){ if( /^M30$/i.test(line) ){ flag = 'end'; } } if( flag == 'overhead' ){ info.overhead.push(line) } else if( flag == 'head' ){ if(/^T(\d+)C(.*)/.test(line)){ if(2 - section_tool/1000 < 0.0001){ section_number = RegExp.$1; } } info.head.push(line) } else if( flag == 'neck' ){ info.neck.push(line) } else if( flag == 'body' ){ if( /^(T(\d+))$/i.test(line) ){ router_flag = RegExp.$1; } if(router_flag){ var num = router_flag.slice(1) - 0; info.body[router_flag].num = num; // 判断孔的范围 2020-04-21 if(num - section_number < 0.001 && /^T/.test(line)){ var point = change_coode_to_vale(line); var are_check = 0; drl_section_data.forEach(function(symbol){ var dist = genMath.point2sym_dist(point,symbol); if(dist == 0){ are_check = 1; } }) if(are_check){ drl_section.push(line) }else{ info.body[router_flag].value.push(line) } }else{ info.body[router_flag].value.push(line) } } } else if( flag == 'end' ){ info.end.push(line) } }) return info; } function convert_new_program(par){ open(NEWMYFILE,">$par{new_file}"); var data = par.data; ##0.插入表头 if($par{x} != 1 or $par{y} != 1){ print NEWMYFILE 'M47,'.job.' '.'X:'.$par{x}.' '.'Y:'.$par{y},"\n"; } ##1.头顶(刀径清单之前的)/overhead foreach my $line(@{$data{overhead}}){ print NEWMYFILE $line,"\n"; } ## ##2.程序头(router清单)/head my $tool_change = get_tool_change(layer=>$par{layer},data=>$par{data}); #$GUI->debug(dump($tool_change)); ###人工排序一次 $tool_change = manual_sort_tool(layer=>$par{layer},data=>$par{data},info=>$tool_change); return $tool_change if $tool_change eq 'Cancel'; ##目前扩孔后没有其它类型的孔 my $nibble_suffix = 1; my $check_nibble_tool = 0; foreach my $line(@{$data{head}}){ my ($tool,$suffix) = $line =~ /^(T\d+)C.*$/; next unless $tool; ##刀序顺序使用最新的 next unless $tool_change->{$tool}{new_tool}; foreach my $item(values %$tool_change){ if( $tool eq $item->{new_tool} ){ if($tool_change->{$item->{new_tool}}{size} > 6.35){ if(! $check_nibble_tool){ print NEWMYFILE $tool.'C'.(3.15 + $nibble_suffix/1000),"\n"; #$nibble_suffix++; $check_nibble_tool = 1; } }else{ print NEWMYFILE $item->{new_header},"\n"; } $PAR->{tool_num_count} = $item->{new_tool_num} unless ($PAR->{tool_num_count} and $PAR->{tool_num_count} > $item->{new_tool_num}); #$hole_exit = 1 if $item->{new_header} =~ /503$/; } } } if($par{layer} =~ /(cdr|vpg|alp|alr|psp)/){ print NEWMYFILE 'T99C0.549',"\n"; } ##3.脖子(程序头和正式T序坐标之间)/neck foreach my $line(@{$data{neck}}){ next if $line =~ /g93/i; print NEWMYFILE $line,"\n"; } if(@drl_section_data){ print NEWMYFILE 'T'.$section_number,"\n"; foreach my $tmp (@drl_section){ print NEWMYFILE $tmp,"\n"; } } ##4.实际的每把T序/body my $nibble_tool_check = 0; foreach my $tool (sort{$data{body}{$a}{num}<=>$data{body}{$b}{num}} keys %{$data{body}}){ ##获取对应的新刀径 my $new_tool; my $check_drl_section = 0; foreach my $old_tool(keys %$tool_change){ if( $tool eq $tool_change->{$old_tool}{new_tool} ){ $new_tool = $old_tool; } } next unless $new_tool; foreach my $line(@{$data{body}{$new_tool}{value}}){ #if( abs($tool_change->{$new_tool}{size} - 3.175) < 0.001 ){ # if( $line =~ /^(T\d+)/ ){ # print NEWMYFILE '/',$tool,"\n"; # } # else{ # print NEWMYFILE '/',$line,"\n"; # } #} #else{ #if( $line =~ /^(T\d+)/ ){ # print NEWMYFILE $tool,"\n"; #} #else{ # print NEWMYFILE $line,"\n"; #} #} if( $tool_change->{$new_tool}{size} > 6.35 ){ if( $line =~ /^(T\d+)/ ){ if( !$nibble_tool_check ){ print NEWMYFILE $tool,"\n"; $nibble_tool_check = 1; } } else{ print NEWMYFILE $line,"\n";#'G84X'.$tool_change->{$new_tool}{size} } } else{ if( $line =~ /^(T\d+)/ ){ print NEWMYFILE $tool,"\n"; } else{ if( $line =~ /X.*Y.*G85X.*Y.*/ ){ my ($tmp1,$tmp2) = $line =~ /(X\-?\d*\.?\d*Y\-?\d*\.?\d*)G85(X\-?\d*\.?\d*Y\-?\d*\.?\d*)/; my $slot_star = change_coode_to_vale($tmp1); my $slot_end = change_coode_to_vale($tmp2); my $slot_size = $tool_change->{$new_tool}{size}; my $slot_length = $slot_size + TL::GenMath->line_length({xs=>$slot_star->{x},xe=>$slot_end->{x},ys=>$slot_star->{y},ye=>$slot_end->{y}}); my $slot_info = ger_short_slot_vale(slot_size=>$slot_size,slot_length=>$slot_length); #if($slot_info){ # my $angle = $slot_info->{angle}; # my $point = TL::GenMath->rotate_point($slot_star,$slot_end,$angle); # my $tmp_data = change_coode(data=>{x=>$point->{x},y=>$point->{y}},datum=>{x=>0,y=>0}); # my $tmp_line = $tmp1.'G85'.$tmp_data; # print NEWMYFILE $tmp_line,"\n"; #}else{ print NEWMYFILE $line,"\n"; #} }else{ print NEWMYFILE $line,"\n"; } } } } } #插入M97坐标 'X-214500Y000000' if($par{layer} =~ /(cdr|vpg|alp|alr|psp)/){ my @feat = GEN.getFeatures(job=>job,step=>step,layer=>'pnl-map',units=>'mm'); my @feat_M97 = grep($_->{attributes}->[0] =~ /(DRL_TXT_DRL)/,@feat); my $coordinate_txt; my $mode;#判断*的位置是横放还是竖放 1 代表横放 2代表竖放 if($feat_M97[0]->{x} >= $PAR->{sr}{xmin} and $feat_M97[0]->{x} <= $PAR->{sr}{xmax}){ $mode = 1; }else{ $mode = 2; } if($datum->{angle} == 90){ my @M97_tmp = TL::GenMath->p_trans($datum,$datum->{angle},'no',0,0,({x=>$feat_M97[0]->{x},y=>$feat_M97[0]->{y}}));#返回的是一个数组 if($mode == 1){ $coordinate_txt = change_coode(data=>{x=>$M97_tmp[0]->{x} + 2.5 - 0.275,y=>$M97_tmp[0]->{y} - 25 + 0.275},datum=>$datum); }else{ $coordinate_txt = change_coode(data=>{x=>$M97_tmp[0]->{x} - 25 + 0.275,y=>$M97_tmp[0]->{y} - 2.5 + 0.275},datum=>$datum); } }else{ if($mode == 1){ $coordinate_txt = change_coode(data=>{x=>$feat_M97[0]->{x} - 25 + 0.275,y=>$feat_M97[0]->{y} - 2.5 + 0.275},datum=>$datum); }else{ $coordinate_txt = change_coode(data=>{x=>$feat_M97[0]->{x} + 2.5 - 0.275,y=>$feat_M97[0]->{y} - 25 + 0.275},datum=>$datum); } } if($datum->{angle} == 90){ print NEWMYFILE 'T99',"\n"; if($mode == 1){ #GEN.PAUSE('M98'); print NEWMYFILE 'M98,'.substr(job,0,6).' $S$I',"\n"; }else{ #GEN.PAUSE('M97'); print NEWMYFILE 'M97,'.substr(job,0,6).' $S$I',"\n"; } print NEWMYFILE $coordinate_txt,"\n"; }else{ print NEWMYFILE 'T99',"\n"; if($mode == 1){ print NEWMYFILE 'M97,'.substr(job,0,6).' $S$I',"\n" }else{ print NEWMYFILE 'M98,'.substr(job,0,6).' $S$I',"\n"; } print NEWMYFILE $coordinate_txt,"\n"; } } ##5.结束/end foreach my $line(@{$data{end}}){ print NEWMYFILE $line,"\n"; } ## close (NEWMYFILE); return undef; } sub get_tool_change{ my %par = @_; my %info; my %data = %{$par{data}}; my $is_laser = $par{is_laser}; my $row_num = 0; ## my (%head,%special,$exist_2500); ##先判断有无3.054的刀径(排第1) foreach my $line(@{$data{head}}){ my ($tool,$size,$data) = $line =~ /^(T\d+)C(\d*\.?\d{3})(S?.*)$/; next unless $tool; $head{$tool}{data} = 'C'.$2; #### if( abs($size - 0.001) < 0.0001 ){ $head{$tool}{data} = 'C3.054'; $row_num++; $info{$tool}{new_tool_num} = $row_num; $info{$tool}{new_tool} = 'T'.sprintf("%02s",$row_num); $info{$tool}{size} = 3.054; $info{$tool}{new_header} = $info{$tool}{new_tool}.$head{$tool}{data}; } } foreach my $line(@{$data{head}}){ my ($tool,$size,$data) = $line =~ /^(T\d+)C(\d*\.?\d{3})(.*)$/; next unless $tool; next if(abs($size - 0.001) < 0.0001); $row_num++; $info{$tool}{size} = $size; $info{$tool}{new_tool_num} = $row_num; $info{$tool}{new_tool} = 'T'.sprintf("%02s",$row_num); $info{$tool}{new_header} = $info{$tool}{new_tool}.$head{$tool}{data}; } return \%info; } sub manual_sort_tool{ my %par = @_; my $data = $par{data}; my $tool_info = $par{info}; my @items; my ($slot_flag,@slot_size); foreach my $num(1..scalar(keys %{$data->{body}})){ my $tool = 'T'.sprintf("%02s",$num); next unless $tool_info->{$tool}{new_tool}; foreach my $old_tool(sort{$tool_info->{$a}{new_tool_num}<=>$tool_info->{$b}{new_tool_num}} keys %$tool_info){ if( $tool eq $tool_info->{$old_tool}{new_tool} ){ my $suffix; my $size = $tool_info->{$old_tool}{size}; push @items,{tool=>$old_tool,size=>$tool_info->{$old_tool}{size} >= 1 ? $tool_info->{$old_tool}{size} : '0'.$tool_info->{$old_tool}{size},suffix=>$suffix}; last; } } } update_loading("$par{layer} 层请确认钻刀排列顺序...",0,position=>'n'); my %form = $GUI->show_form( -title => "请确认钻孔刀径顺序", -defaultsize => [400,500], -columns => 2, -items => [ { name => 'table', type => 'treeview', label => '', label_position => 'top', expand=>1, scrolledwindow=>{}, property => { height_request=>200, tl_model_type => 'list', enable_grid_lines => 'none', tl_mapping =>['tool' => 'Glib::String','size' => 'Glib::String','suffix'=>'Glib::String'], tl_columns =>[ {title=>'原始刀序',visible=>1,resizable=>1,min_width=>80,expand=>1,renders=>[{class=>'Text',property=>{editable=>0,background=>'#FCFBB6',foreground=>'#000000'},text=>'tool'}]}, {title=>'刀径',visible=>1,resizable=>1,min_width=>80,expand=>1,renders=>[{class=>'Text',property=>{editable=>0,background=>'#FCFBB6',foreground=>'#000000'},text=>'size'}]}, {title=>'后缀(可编辑)',visible=>1,resizable=>1,min_width=>80,expand=>1,renders=>[{class=>'Text',property=>{editable=>1,background=>'#C5DBF2',foreground=>'#000000'},text=>'suffix'}]}, ], }, value => \@items, get_value_func => sub{ my %par = @_; my $tvdata = $par{widget}->tl_get_model_data(); return $tvdata; }, set_value_func => sub{ my %par = @_; my $v = $par{value}; $par{widget}->tl_set_data($v); return 0; }, button_position=>'top', buttons => [ { name=>'top',label=>'置顶',stock=>'gtk-goto-top', command=>sub{ my %p = @_; my $widget = $p{formpanel}->get_widget('table'); $widget->set_property(reorderable=>1); $widget->tl_sel_moveto_top(); $widget->set_property(reorderable=>0); } }, { name=>'up',label=>'上移',stock=>'gtk-go-up', command=>sub{ my %p = @_; my $widget = $p{formpanel}->get_widget('table'); $widget->set_property(reorderable=>1); $widget->tl_sel_move_up(); $widget->set_property(reorderable=>0); } }, { name=>'down',label=>'下移',stock=>'gtk-go-down', command=>sub{ my %p = @_; my $widget = $p{formpanel}->get_widget('table'); $widget->set_property(reorderable=>1); $widget->tl_sel_move_down(); $widget->set_property(reorderable=>0); } }, { name=>'bottom',label=>'置底',stock=>'gtk-goto-bottom', command=>sub{ my %p = @_; my $widget = $p{formpanel}->get_widget('table'); $widget->set_property(reorderable=>1); $widget->tl_sel_moveto_bottom(); $widget->set_property(reorderable=>0); } }, ], }, ] ); return 'Cancel' unless %form; ##将界面确认的结果重新整理一遍 my %info; my @data = @{$form{table}}; my $row_num; foreach my $item(@data){ $row_num++; if( $item->{suffix} =~ /^\(w(\d+)\)$/i || $item->{suffix} =~ /^\(w(\d+)s\d+\)$/i || $item->{suffix} =~ /^\(s(\d+)\)$/i){ $info{$item->{tool}}{suffix} = $item->{suffix}; $info{$item->{tool}}{size} = $item->{size}; } elsif($item->{suffix} =~ /^(\d+)$/i ){ $info{$item->{tool}}{suffix} = $item->{suffix}+0; $info{$item->{tool}}{size} = $item->{size}; } else{ $info{$item->{tool}}{size} = $item->{size}; } $info{$item->{tool}}{new_tool_num} = $row_num; $info{$item->{tool}}{new_tool} = 'T'.sprintf("%02s",$row_num); if( $item->{suffix} =~ /^\((w|s)(\d+)\)$/i || $item->{suffix} =~ /^\(w(\d+)s(\d+)\)$/i){ $info{$item->{tool}}{new_header} = $info{$item->{tool}}{new_tool}.'C'.sprintf("%.3f",$info{$item->{tool}}{size}).$item->{suffix}; } else{ $info{$item->{tool}}{new_header} = $info{$item->{tool}}{new_tool}.'C'.sprintf("%.3f",$info{$item->{tool}}{size}); } } ## return \%info; } sub input_drill_program{ my %par = @_; GEN.COM( "input_manual_reset"); GEN.COM( "input_manual_set,path=$par{file},job=job,step=step,format=Excellon2,data_type=ascii, units=mm,coordinates=absolute,zeroes=none,nf1=3,nf2=3,decimal=no,separator=nl,tool_units=mm,layer=$par{new_layer},wheel=, wheel_template=,nf_comp=0,multiplier=1,text_line_width=0.0024,signed_coords=no,break_sr=yes,drill_only=no,merge_by_rule=no,threshold=200,resolution=3"); GEN.COM( "input_manual,script_path="); GEN.zoomHome(); return undef; } =head web server数据传输 =cut sub sec_web_services{ use LWP::UserAgent; use LWP; use HTTP::Headers; use HTTP::Response; use Encode; use JSON; use JSON qw(encode_json); my $url = shift; my $data = shift; my $json = JSON->new->allow_nonref; my $ua = LWP::UserAgent->new(); $ua->agent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0"); my $header = ['Content-Type' => 'application/json; charset=UTF-8']; my $body = encode('utf8', $json->encode($data)); my $request = HTTP::Request->new('POST', $url, $header, $body); my $res = $ua->request($request); #$GUI->debug(-text=>dump($res,'-----------------------------------------------------------------',$res->is_success)); if ($res->is_success) { return 0; }else{ return 1; } } =head 3:3 不省零 坐标转换 data=>{x=>,y=>} datum=>{x=>,y=>} =cut sub change_coode { my %par = @_; my ($check_x,$check_y); $par{data}->{x} = $par{data}->{x} - $par{datum}->{x}; $par{data}->{y} = $par{data}->{y} - $par{datum}->{y}; $check_x = $par{data}->{x} > 0 ? '': '-'; $check_y = $par{data}->{y} > 0 ? '': '-'; $par{data}->{x} = sprintf("%0.3f",$par{data}->{x}); $par{data}->{x} = sprintf("%06s",abs($par{data}->{x})*1000); $par{data}->{y} = sprintf("%0.3f",$par{data}->{y}); $par{data}->{y} = sprintf("%06s",abs($par{data}->{y})*1000); return 'X'.$check_x.($par{data}->{x}).'Y'.$check_y.($par{data}->{y}); } =head 坐标转换成数值 =cut sub change_coode_to_vale { my $string = shift; $string =~ /X(-?\w+)Y(-?\w+)/; my $x_data = sprintf("%0.3f",$1/1000); my $y_data = sprintf("%0.3f",$2/1000); return {x=>$x_data,y=>$y_data}; } sub _deleteLayer{ my %par = @_; foreach my $layer(@{$par{layer}}){ GEN.deleteLayer(layer=>$layer) if (GEN.isLayerExists(job=>job,layer=>$layer)); } } =head 输出层新命名 =cut sub get_new_layer_name { my job = shift; my @tmp = split/\-/,job; splice(@tmp,2,1); $tmp[2] =~ s/2//; unless($tmp[2]){ splice(@tmp,2,1); } my $new = join('-',@tmp); return $new; } =head 短槽拉伸值 slot_size=>,slot_length=> =cut sub ger_short_slot_vale { my %par = @_; my $info = { 1.5 =>[ {size_min=>0.4,size_max=>0.55,length=>0,angle=>0}, {size_min=>0.6,size_max=>0.65,length=>0.07,angle=>5}, {size_min=>0.7,size_max=>0.75,length=>0.0625,angle=>4}, {size_min=>0.8,size_max=>0.95,length=>0.05,angle=>2.5}, {size_min=>1.0,size_max=>1.25,length=>0.045,angle=>2}, {size_min=>1.3,size_max=>1.6,length=>0.0375,angle=>1}, {size_min=>1.65,size_max=>2.5,length=>0.0375,angle=>1}, {size_min=>2.55,size_max=>999,length=>0.03,angle=>0.5}, ], 1.75 =>[ {size_min=>0.4,size_max=>0.55,length=>0.055,angle=>4}, {size_min=>0.6,size_max=>0.65,length=>0.055,angle=>3}, {size_min=>0.7,size_max=>0.75,length=>0.05,angle=>2.5}, {size_min=>0.8,size_max=>0.95,length=>0.045,angle=>2}, {size_min=>1.0,size_max=>1.25,length=>0.0375,angle=>1}, {size_min=>1.3,size_max=>1.6,length=>0.03,angle=>0.5}, {size_min=>1.65,size_max=>2.5,length=>0.03,angle=>0.5}, {size_min=>2.55,size_max=>999,length=>0.025,angle=>0.5}, ], 2.0 =>[ {size_min=>0.4,size_max=>0.55,length=>0.045,angle=>3}, {size_min=>0.6,size_max=>0.65,length=>0.0375,angle=>2}, {size_min=>0.7,size_max=>0.75,length=>0.0375,angle=>1.5}, {size_min=>0.8,size_max=>0.95,length=>0.03,angle=>1}, {size_min=>1.0,size_max=>1.25,length=>0.03,angle=>1}, {size_min=>1.3,size_max=>1.6,length=>0.025,angle=>0.5}, {size_min=>1.65,size_max=>2.5,length=>0.02,angle=>0.5}, {size_min=>2.55,size_max=>999,length=>0.02,angle=>0}, ], }; my $type; if($par{slot_length}/$par{slot_size} <= 1.5){ $type = 1.5; }elsif($par{slot_length}/$par{slot_size} > 1.5 and $par{slot_length}/$par{slot_size} <= 1.75){ $type = 1.75; }elsif($par{slot_length}/$par{slot_size} > 1.75 and $par{slot_length}/$par{slot_size} <= 2){ $type = 2.0; }elsif($par{slot_length}/$par{slot_size} > 2){ return 0; } my $result; foreach my $tmp (@{$info->{$type}}){ if($par{slot_size} >= $tmp->{size_min} and $par{slot_size} <= $tmp->{size_max}){ $result = 1; return $tmp; } } unless ($result){ return 0; } }