my work step

cat /proc/partitions

mount /dev/sda1 /mnt/nfs

cd /mnt/nfs

 

编译出来的QT放到目标板上运行

 QtEmbedded-4.7-arm这个目录完整的拷贝到SD卡上

代码2 #!/usr/bin/perl -w ######################################### ### Author : fszhu ##### ### Date : 11/28/2020 ##### ### Function : 审单检查panel_id位置 ##### ######################################### use strict; use Tk; use Encode; use utf8; use lib "/incam/server/site_data/scripts/fszhu/env"; use often; if ($ENV{INCAM_DEBUG}) { # $ENV{USESOCKET} = 1; eval("use lib '/home/incam/perl';"); eval("use incam;"); } else { eval("use lib '/incam/release/app_data/perl';"); eval("use incam;"); } use lib "/incam/server/site_data/scripts/sublib"; use ICO; my $host = shift; my $f; if ($ENV{INCAM_DEBUG}) { my $pidInfo = ICO::GetActiveInCAMInfo(); $f = ICO::StartDebug($pidInfo); } else { $f = new incam($host); } my $JOB = $ENV{JOB}; my $STEP = $ENV{STEP}; ################################################################################## my $hasPanelId = 'no'; my $hasPanelId2 = 'no'; ### 仅审单运行当前程序 $f->COM('get_user_group'); my $usrGroup = $f->{COMANS}; $f->COM("get_user_name"); my $usrName = $f->{COMANS}; unless ( $usrGroup eq 'MKT' or $usrName eq 'zhufs' or $usrName eq 'lijx') { exit; } exit if ($JOB =~ /(301130713)/); if ( $STEP !~ /sub-p/) { $STEP = 'sub-p'; } $f->COM('set_step', name => 'sub-p'); $f->COM('open_group', job => $JOB, step => 'sub-p', is_sym => "no"); $f->AUX('set_group', group => $f->{COMANS}); $f->COM('open_entity', job => $JOB, type => "step", name => 'sub-p', iconic => "no"); &often::initialization($f, $JOB); # 获取sub-p中block信息 my $BlockData = &getBlockData($JOB,$STEP); # 获取transform的anchor坐标 $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'step', entity_path => "$JOB/$STEP", data_type => 'PROF_LIMITS'); my $nLIMITSxmin = $f->{doinfo}{gPROF_LIMITSxmin} * -1; my $nLIMITSymin = $f->{doinfo}{gPROF_LIMITSymin} * -1; $f->INFO(units => 'mm', entity_type => 'matrix', entity_path => "$JOB/matrix"); my @gCOLstep_name = @{$f->{doinfo}{gCOLstep_name}}; my @gROWname = @{$f->{doinfo}{gROWname}}; my @gROWcontext = @{$f->{doinfo}{gROWcontext}}; my @gROWlayer_type = @{$f->{doinfo}{gROWlayer_type}}; my @gROWside = @{$f->{doinfo}{gROWside}}; my $i = 0; my (@smLayers, @sigLayers, @drlLayers, @outLayers); foreach my $lay (@gROWname) { if ( $gROWcontext[$i] eq 'board' ) { if ( $gROWlayer_type[$i] eq 'solder_mask') { push(@smLayers, $gROWname[$i]); } if ( $gROWlayer_type[$i] eq 'signal') { push(@sigLayers, $gROWname[$i]); } if ( $gROWlayer_type[$i] eq 'drill') { push(@drlLayers, $gROWname[$i]); } } if ( $gROWname[$i] eq 'panel-id' ) { $hasPanelId = 'yes'; } if ( $gROWname[$i] eq 'panel-id2' ) { $hasPanelId2 = 'yes'; } $i ++; } @outLayers = ( $sigLayers[0], $sigLayers[-1] ); $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'step', entity_path => "$JOB/$STEP", data_type => 'SR', options => "consider_origin"); my @gSRstep = @{$f->{doinfo}{gSRstep}}; my @gSRnx = @{$f->{doinfo}{gSRnx}}; my @gSRny = @{$f->{doinfo}{gSRny}}; my $unitNum = 0; my $n = 0; foreach my $step (@gSRstep) { my $gSRnx = $gSRnx[$n]; my $gSRny = $gSRny[$n]; if ($step =~ /edit/ and $step !~ /set/) { $unitNum += ($gSRny * $gSRnx); } $n ++; } # panel-id检查逻辑 if ( $hasPanelId eq 'no' ) { my $mes = "\t提示\n请确认【客户】是否有“panel-id”设计需求?"; my $ans = &often::DialogShowUtf8($mes, 'question', ' 有 ', ' 没有 '); if ($ans == 0) { my $mes = "\t错误\n有“panel-id”需求,但JOB中未检测到“panel-id”层,请制作!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); print "$mes\n"; exit(-1); } } else { # 检查panel-id数量、字符属性、sub-p是否为空、edit是否为空 &checkPanelId('panel-id'); # 每个block选中左下角的panel-id进行阵列 &repeatPanelId('panel-id'); # panel-id层与阵列出来的panel-id_temp层进行compare &comparePanelId('panel-id'); # 生成辅助层tmp_id_holes_lyr &fillProfill(); foreach my $wkLay ( @outLayers, @smLayers ) { # unit不能包含panel id &checkUnitId($wkLay); # 检查线路阻焊层id与panel id层位置是否一致 &checkPosition($wkLay); } &often::delLayer($f, $JOB, "tmp_id_holes_lyr"); } # panel-id2检查逻辑 if ($hasPanelId2 eq 'no' ) { if ($hasPanelId eq 'no') { # 没有panel-id设计要求,也不存在panel-id2层,提示并退出到主程序 my $mes = "\t警告\n确认无panel-id设计!!!"; my $ans = &often::mesgBoxShow($mes, 'warning', 'Ok'); print "$mes\n"; exit; } else { # 弹窗选择是否有panel-id2设计,注意此时有panel-id层 my $mes = "\t提示\n请确认【客户】是否有“panel-id2”设计需求?"; my $ans = &often::DialogShowUtf8($mes, 'question', ' 有 ', ' 没有 '); if ($ans == 0) { my $mes = "\t错误\n有“panel-id2”需求,但JOB中未检测到“panel-id2”层,请制作!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); $f->COM('skip_next_com'); print "$mes\n"; exit(-1); } else { # 没有panel-id2层,弹窗也选择了没有panel-id2设计,退出到主程序, # INFO 没必要提示,容易造成误解 # my $mes = "\t警告\n确认无panel-id设计!!!"; # my $ans = &often::mesgBoxShow($mes, 'warning', 'Ok'); # print "$mes\n"; # exit; } } } else { # 检查panel-id2数量、字符属性、sub-p是否为空、edit是否为空 &checkPanelId('panel-id2'); foreach my $wkLay ( @outLayers, @smLayers ) { # 检查线路阻焊层id与panel-id2层位置是否一致 &checkPositionMirror($wkLay,'panel-id2'); } } # -------------------------------------------------- 函数区 ------------------------------------------ # panel-id层检查逻辑 # 传入 : $wkLay # 返回 : 无 # 用例 : &checkPanelId('panel-id'); sub checkPanelId { my $wkLay = shift; $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'layer', entity_path => "$JOB/$STEP/$wkLay",data_type => 'FEAT_HIST'); my $subFHISTtext = $f -> {doinfo}{gFEAT_HISTtext}; my $subFEATtotal = my $gSR_LIMITSymin = $f->{doinfo}{gFEAT_HISTtotal}; $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'layer', entity_path => "$JOB/$STEP/$wkLay",data_type => 'FEAT_HIST',options => "break_sr"); my $srFHISTtext = $f -> {doinfo}{gFEAT_HISTtext}; my $srFEATtotal = $f -> {doinfo}{gFEAT_HISTtotal}; # sub-p里panel-id层不能为空 if ($subFEATtotal == 0) { my $mes = "\t错误!\nsub-p《$wkLay》层为空,\n请修改并重新运行!!!\n"; my $ans = &often::mesgBoxShow($mes, 'error', 'OK'); print "$mes\n"; exit(-1); } # edit中panel-id层必须为空 if ( $subFEATtotal != $srFEATtotal ) { my $mes = "\t错误!\n《$wkLay》层Unit中有图形,\n请修改并重新运行!!!\n"; my $ans = &often::mesgBoxShow($mes, 'error', 'OK'); print "$mes\n"; exit(-1); } # panel-id须为字符属性 if ($srFEATtotal != $srFHISTtext) { my $mes = "\t错误!\n《$wkLay》层须为字符属性,\n请修改并重新运行!!!\n"; my $ans = &often::mesgBoxShow($mes, 'error', 'OK'); print "$mes\n"; exit(-1); } if ($wkLay eq 'panel-id') { # 判断panel-id个数是否和strip unit个数相同 if ($subFHISTtext != $unitNum) { my $mes = "\t错误!\n《$wkLay》个数与unit个数不一致,\n请修改并重新运行!!!\n"; my $ans = &often::mesgBoxShow($mes, 'error', 'OK'); print "$mes\n"; # $f->PAUSE("$mes"); exit(-1); } } else { # panel-id2个数 if ($subFHISTtext != 1) { my $mes = "\t错误!\n《$wkLay》不是一个,\n请修改并重新运行!!!\n"; my $ans = &often::mesgBoxShow($mes, 'error', 'OK'); print "$mes\n"; exit(-1); } } } # 生成辅助层tmp_id_holes_lyr,即填充unit # 传入 : 无 # 返回 : 无 # 用例 : &fillProfill(); sub fillProfill { $f -> VOF; &often::createLay($f, $JOB, "misc", "signal", "tmp_fill_profile"); $f -> VON; $f->COM('clear_layers'); $f->COM('display_layer', name => "tmp_fill_profile", display => "yes"); $f->COM('work_layer', name => "tmp_fill_profile"); $f->COM('sr_fill', type => "solid", solid_type => "surface", min_brush => "2.54", use_arcs => "yes", cut_prims => "no", outline_draw => "no", outline_width => 0, outline_invert => "no", polarity => "positive", step_margin_x => 0, step_margin_y => 0, step_max_dist_x => 2540, step_max_dist_y => 2540, sr_margin_x => 0, sr_margin_y => 0, sr_max_dist_x => 0, sr_max_dist_y => 0, nest_sr => "no", consider_feat => "no", feat_margin => 0, consider_drill => "no", drill_margin => 0, consider_rout => "no", dest => "affected_layers", layer => ".affected", stop_at_steps => ""); $f->COM('sel_break_isl_hole', islands_layer => "tmp_id_isl_lyr", holes_layer => "tmp_id_holes_lyr"); &often::delLayer($f, $JOB, "tmp_fill_profile", "tmp_id_isl_lyr"); } # 检查unit中是否包含panel id # 传入 : $wkLay # 返回 : 无 # 用例 : &checkUnitId('panel-id'); sub checkUnitId { my $wkLay = shift; $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'layer', entity_path => "$JOB/$STEP/$wkLay",data_type => 'FEAT_HIST'); my $subFHISTtext = $f -> {doinfo}{gFEAT_HISTtext}; $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'layer', entity_path => "$JOB/$STEP/$wkLay",data_type => 'FEAT_HIST',options => "break_sr"); my $srFHISTtext = $f -> {doinfo}{gFEAT_HISTtext}; if ( $srFHISTtext > $subFHISTtext ) { # unit是否包含字符 ### flatten_layer, strip中先删除后恢复 $f->COM('copy_layer', source_job => $JOB, source_step => "sub-p", source_layer => $wkLay, dest => "layer_name", dest_step => "", dest_layer => $wkLay."_idbak", mode => "replace", invert => "no", copy_notes => "no", copy_attrs => "no", copy_sr_feat => "no"); $f->COM('truncate_layer', layer => $wkLay); $f->COM('flatten_layer', source_layer => $wkLay, target_layer => "err_pid_".$wkLay, suffix => "", selective => "no"); $f->COM('copy_layer', source_job => $JOB, source_step => "sub-p", source_layer => $wkLay."_idbak", dest => "layer_name", dest_step => "", dest_layer => $wkLay, mode => "replace", invert => "no", copy_notes => "no", copy_attrs => "no", copy_sr_feat => "no"); &often::delLayer($f, $JOB, $wkLay."_idbak"); $f->COM('clear_layers'); $f->COM('display_layer', name => "err_pid_".$wkLay, display => "yes"); $f->COM('work_layer', name => "err_pid_".$wkLay); $f->COM('reset_filter_criteria', filter_name => "", criteria => "all"); $f->COM('set_filter_type', filter_name => "", lines => "no", pads => "no", surfaces => "no", arcs => "no", text => "yes"); $f->COM('sel_ref_feat', layers => "panel-id", use => "filter", mode => "touch", f_types => "line;pad;surface;arc;text", polarity => "positive;negative", include_syms => "", exclude_syms => ""); if ( $f->{COMANS} > 0 ) { $f->COM('sel_reverse'); $f->COM('get_select_count'); if ( $f->{COMANS} > 0 ) { $f->COM('sel_delete'); } my $mes = "\t错误\n".$wkLay."层Unit存在Panel_id,参考err_pid_".$wkLay."层,请修改并重新运行!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); print "$mes\n"; exit(-1); } else { &often::delLayer($f, $JOB, "err_pid_".$wkLay); } } } # 检查线路阻焊层id与panel id层位置是否一致 # 传入 : wkLay # 返回 : 无 # 用例 : &checkPosition($wkLay); sub checkPosition { my $wkLay = shift; &often::delLayer($f, $JOB, "err_id_".$wkLay, "map_err_id_".$wkLay); $f->COM('clear_layers'); $f->COM('display_layer', name => $wkLay, display => "yes"); $f->COM('work_layer', name => $wkLay); $f->COM('display_sr', display => "no"); $f->COM('reset_filter_criteria', filter_name => "", criteria => "all"); $f->COM('set_filter_type', filter_name => "", lines => "no", pads => "no", surfaces => "no", arcs => "no", text => "yes"); $f->COM('sel_ref_feat', layers => "tmp_id_holes_lyr", use => "filter", mode => "touch", f_types => "line;pad;surface;arc;text", polarity => "positive;negative", include_syms => "", exclude_syms => ""); my $selCount = $f->{COMANS}; if ( $selCount > 0 ) { $f->COM('sel_copy_other', dest => "layer_name", target_layer => "err_id_".$wkLay, invert => "no", dx => 0, dy => 0, size => 0, x_anchor => 0, y_anchor => 0); $f->COM('clear_layers'); $f->COM('display_layer', name => "err_id_".$wkLay, display => "yes"); $f->COM('work_layer', name => "err_id_".$wkLay); ### 删除其它字符(unit id) $f->COM('reset_filter_criteria', filter_name => "", criteria => "all"); $f->COM('sel_ref_feat', layers => "panel-id", use => "filter", mode => "disjoint", f_types => "line;pad;surface;arc;text", polarity => "positive;negative", include_syms => "", exclude_syms => ""); if ( $f->{COMANS} > 0 ) { $f->COM('sel_delete'); } # 检查panel-id镜像 &checkMirror($wkLay,'id'); # 比较位置差异 $f->COM('graphic_compare_res', layer1 => "err_id_".$wkLay, job2 => $JOB, step2 => $STEP, layer2 => "panel-id", layer2_ext => "", tol => "1", resolution => 508, area => "profile", ignore_attr => "", map_layer_prefix => "map_", consider_sr => "no"); my $mapResults = $f->{COMANS}; if ( $mapResults > 0 ) { &often::delLayer($f, $JOB, "tmp_fill_profile", "tmp_id_isl_lyr"); $f->COM('clear_layers'); $f->COM('display_layer', name => $wkLay, display => "yes"); $f->COM('display_layer', name => "map_err_id_".$wkLay, display => "yes"); $f->COM('display_layer', name => "panel-id", display => "yes"); $f->COM("disp_on"); my $mes = "\t错误\nPanel_id与".$wkLay."层位置不匹配,\n参考“map_err_id_".$wkLay."”,\n请修改并重新运行!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); print "$mes\n"; exit(-1); } else { &often::delLayer($f, $JOB, "err_id_".$wkLay, "map_err_id_".$wkLay); } } $f->COM('reset_filter_criteria', filter_name => "", criteria => "all"); } # 检查panel-id镜像 # 传入 : wkLay # 返回 : 无 # 用例 : &checkMirror($wkLay,'id2'); sub checkMirror { my $wkLay = shift; my $id = shift; # 检查文字镜像是否正确 my @mirror; my $mirrorErr = 'no'; $f->COM('info', out_file => "/tmp/FEATURES.txt", write_mode => "replace", units => "mm", angle_direction => "ccw", args => " -t layer -e $JOB/$STEP/err_${id}_$wkLay -m script -d FEATURES -o consider_origin+feat_index+f0"); open GETINFO,"< /tmp/FEATURES.txt"; foreach my $row (<GETINFO>) { chomp $row; # #86 #T 11.787575 14.45725 standard P 0 N 0.5 0.68 0.24606 'E' 1;.nomenclature,.string=1 if ($row =~ /#T\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/g ) { my ($x,$y,$font,$polarity,$angle,$mirror) = ($1,$2,$3,$4,$5,$6); if ($mirror eq 'N') { $mirror = 'no'; } else { $mirror = 'yes'; } push @mirror, $mirror unless (ICO::InStrArray($mirror,@mirror)); } } close GETINFO; unlink "/tmp/FEATURES.txt"; if (@mirror >= 2) { # 同时存在正、反,肯定会有镜像错误 $mirrorErr = 'yes'; } $f->INFO(units => 'mm', angle_direction => 'ccw', entity_type => 'layer', entity_path => "$JOB/$STEP/$wkLay", data_type => 'SIDE'); my $side = $f->{doinfo}{gSIDE}; if ($side eq 'top') { if ($mirrorErr eq 'no' and $mirror[0] eq 'yes') { $mirrorErr = 'yes'; } } elsif ($side eq 'bottom') { if ($mirrorErr eq 'no' and $mirror[0] eq 'no') { $mirrorErr = 'yes'; } } if ($mirrorErr eq 'yes') { my $mes = "\t错误\n".$wkLay."层Panel_${id}镜像错误,\n请修改并重新运行!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); print "$mes\n"; exit(-1); } } # panel-id2层检查位置及镜像 # 传入 : wLay # 返回 : 无 # 用例 : &checkPositionMirror($wLay); sub checkPositionMirror { my $wkLay = shift; my $rfLay = shift; &often::delLayer($f, $JOB, "err_id2_".$wkLay, "map_err_id2_".$wkLay); $f->COM('clear_layers'); $f->COM('display_layer', name => $wkLay, display => "yes"); $f->COM('work_layer', name => $wkLay); $f->COM('display_sr', display => "no"); $f->COM('reset_filter_criteria', filter_name => "", criteria => "all"); $f->COM('set_filter_type', filter_name => "", lines => "no", pads => "no", surfaces => "no", arcs => "no", text => "yes"); $f->COM('sel_ref_feat', layers => "$rfLay", use => "filter", mode => "touch", f_types => "line;pad;surface;arc;text", polarity => "positive;negative", include_syms => "", exclude_syms => ""); my $selCount = $f->{COMANS}; if ( $selCount > 0 ) { $f->COM('sel_copy_other', dest => "layer_name", target_layer => "err_id2_".$wkLay, invert => "no", dx => 0, dy => 0, size => 0, x_anchor => 0, y_anchor => 0); # 检查panel-id镜像 &checkMirror($wkLay,'id2'); # 比较位置差异 $f->COM('graphic_compare_res', layer1 => "err_id2_".$wkLay, job2 => $JOB, step2 => $STEP, layer2 => "panel-id2", layer2_ext => "", tol => "1", resolution => 508, area => "profile", ignore_attr => "", map_layer_prefix => "map_", consider_sr => "no"); my $mapResults = $f->{COMANS}; if ( $mapResults > 0 ) { $f->COM('clear_layers'); $f->COM('display_layer', name => $wkLay, display => "yes"); $f->COM('display_layer', name => "map_err_id2_".$wkLay, display => "yes"); $f->COM('display_layer', name => "panel-id2", display => "yes"); $f->COM("disp_on"); my $mes = "\t错误\nPanel_id2与".$wkLay."层位置不匹配,\n参考“map_err_id2_".$wkLay."”,\n请修改并重新运行!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); print "$mes\n"; exit(-1); } else { &often::delLayer($f, $JOB, "err_id2_".$wkLay, "map_err_id2_".$wkLay); } } $f->COM('reset_filter_criteria', filter_name => "", criteria => "all"); } # 每个block选中左下角的panel-id进行阵列 # 传入 : wkLay # 返回 : 无 # 用例 : &repeatPanelId('panel-id'); sub repeatPanelId { my $wkLay = shift; my $tmpLay = $wkLay."-temp"; ICO::DelLayer($f,$JOB,$tmpLay); ICO::CreateLay($f,$JOB,"misc", "document", $tmpLay); $f->COM('clear_layers'); $f->COM('affected_layer', mode => 'all', affected => 'no'); foreach my $index (sort{$a<=>$b} keys %{$BlockData}) { $f->COM('display_layer', name => $wkLay, display => 'yes', number => '1'); $f->COM('work_layer',name => $wkLay); my @data = sort{$a->{xcenter} <=> $b->{xcenter} || $a->{ycenter} <=> $b->{ycenter}} @{$BlockData->{$index}{data}}; my $y_min = $data[0]->{ymin}; my $y_max = $data[0]->{ymax}; my $ny = grep {abs($_->{xmin} - $data[0]->{xmin}) < 0.001} @data; my $nx = grep {abs($_->{ymin} - $data[0]->{ymin}) < 0.001} @data; my $i = 0; my $j = 1; for (my $i = 0; $i < @data; $i++) { my $x_min_this = $data[$i]->{xmin}; my $y_min_this = $data[$i]->{ymin}; my $x_max_this = $data[$i]->{xmax}; my $y_max_this = $data[$i]->{ymax}; my ($x_min_next,$y_min_next,$x_max_next,$y_max_next); my ($dx_tmp,$dy_tmp) = (0,0); if ($j < @data) { # 防止@data autovivification自动扩容 $x_min_next = $data[$j]->{xmin}; $y_min_next = $data[$j]->{ymin}; $x_max_next = $data[$j]->{xmax}; $y_max_next = $data[$j]->{ymax}; $dx_tmp = $x_min_next - $x_min_this; $dy_tmp = $y_min_next - $y_min_this; } if ($j % $ny > 0) { if ($j / $ny > 1) { # 除第一列外的其它列,不用每一个都transform,一整列transform,可大大减少循环次数 $j++; next; } } else { # 最后一行,重围y_min_this,选中一整列 $y_min_this = $y_min; $dy_tmp = 0; if ($j == @data) { $j++; next; } } $f->COM('filter_area_strt'); $f->COM('filter_area_xy', x => $x_min_this, y => $y_min_this); $f->COM('filter_area_xy', x => $x_max_this, y => $y_max_this); $f->COM('filter_area_end', layer => '', filter_name => 'popup', operation => 'select', area_type => 'rectangle', inside_area => 'yes',intersect_area => 'yes'); $f->COM('get_select_count'); if ( $f->{COMANS} ) { if ($i == 0) { # 第个block的最左下角的挑出来到tmpLay,再选中并进行transform $f->COM('sel_copy_other', dest => 'layer_name',target_layer => $tmpLay, invert => 'no',dx => 0,dy => 0,size => 0,x_anchor => '0',y_anchor => '0'); $f->COM('display_layer', name => $tmpLay, display => 'yes', number => '1'); $f->COM('work_layer',name => $tmpLay); &sel_copy_repeat($x_min_this,$y_min_this,$x_max_this,$y_max_this,$dx_tmp,$dy_tmp); } else { # 第一列的其它行,或者其它列一整列进行transform my $xOff = $nLIMITSxmin + $dx_tmp; my $yOff = $nLIMITSymin + $dy_tmp; $f->COM("sel_transform,oper=,x_anchor=0,y_anchor=0,angle=0,direction=ccw,x_scale=1,y_scale=1,x_offset=$xOff,y_offset=$yOff,mode=anchor,duplicate=yes"); } } $j++; } } } # panel-id层与阵列出来的panel-id_temp层进行compare # 传入 : wkLay # 返回 : 无 # 用例 : &comparePanelId('panel-id'); sub comparePanelId { my $wkLay = shift; my $tmpLay = $wkLay."-temp"; # 比较位置差异 $f->COM('graphic_compare_res', layer1 => "$tmpLay", job2 => $JOB, step2 => $STEP, layer2 => "panel-id", layer2_ext => "", tol => "1", resolution => 508, area => "profile", ignore_attr => "", map_layer_prefix => "map_err_id_", consider_sr => "no"); my $mapResults = $f->{COMANS}; if ( $mapResults > 0 ) { $f->COM('clear_layers'); $f->COM('display_layer', name => $tmpLay, display => "yes"); $f->COM('display_layer', name => "map_err_id_".$tmpLay, display => "yes"); $f->COM('display_layer', name => "panel-id", display => "yes"); $f->COM("disp_on"); my $mes = "\t错误\nPanel_id与阵列".$tmpLay."层位置不匹配,\n参考“map_err_id_".$tmpLay."”,\n请修改并重新运行!!!"; my $ans = &often::mesgBoxShow($mes, 'error', 'Ok'); print "$mes\n"; exit(-1); } else { &often::delLayer($f, $JOB, $tmpLay, "map_err_id_".$wkLay); } } # 将text做复制阵列处理 # 传入 : $x1,$y1,$x2,$y2,$xOff,$yOff # 返回 : 无 # 用例 : &sel_copy_repeat($x1,$y1,$x2,$y2,0,$yOff); sub sel_copy_repeat { my ($x1,$y1,$x2,$y2,$xOff,$yOff) = @_; $xOff = $nLIMITSxmin + $xOff; $yOff = $nLIMITSymin + $yOff; $f->COM('filter_area_strt'); $f->COM('filter_area_xy', x => $x1, y => $y1); $f->COM('filter_area_xy', x => $x2, y => $y2); $f->COM('filter_area_end', layer => '', filter_name => 'popup', operation => 'select', area_type => 'rectangle', inside_area => 'yes',intersect_area => 'yes'); $f->COM('get_select_count'); if ( $f->{COMANS} ) { $f->COM("sel_transform,oper=,x_anchor=0,y_anchor=0,angle=0,direction=ccw,x_scale=1,y_scale=1,x_offset=$xOff,y_offset=$yOff,mode=anchor,duplicate=yes"); } } # 获取打散后的排版数据 # 传入 : job=>$jobname,step=>$step,units=>'mm'|'inch' 默认='mm' # 返回 : step列表; # 用例 : my @sr_repeat = &getRepeat(job=>$jobname,step=>$step); sub getRepeat { my %par = @_; $par{units}= 'mm' if (! defined $par{units}); $f->INFO('units'=>$par{units},'entity_type'=>'step','entity_path'=>"$par{job}/$par{step}",'data_type'=>'REPEAT',options=>"consider_origin",angle_direction=>'ccw'); my $n = 0; my @return; foreach my $step (@{$f->{doinfo}{gREPEATstep}}){ push @return,{ step=>$f->{doinfo}{gREPEATstep}->[$n], xa=>$f->{doinfo}{gREPEATxa}->[$n], ya=>$f->{doinfo}{gREPEATya}->[$n], angle=>$f->{doinfo}{gREPEATangle}->[$n], mirror=>$f->{doinfo}{gREPEATmirror}->[$n], xmin=>$f->{doinfo}{gREPEATxmin}->[$n], ymin=>$f->{doinfo}{gREPEATymin}->[$n], xmax=>$f->{doinfo}{gREPEATxmax}->[$n], ymax=>$f->{doinfo}{gREPEATymax}->[$n], xsize=>$f->{doinfo}{gREPEATxmax}->[$n] - $f->{doinfo}{gREPEATxmin}->[$n], ysize=>$f->{doinfo}{gREPEATymax}->[$n] - $f->{doinfo}{gREPEATymin}->[$n], }; $n++; } return @return; } # 获取sub-p中block信息 # 传入 : $jobname,$step # 返回 : $return_data; # 用例 : my $BlockData = &getBlockData($JOB,$STEP); sub getBlockData { my $jobname = shift; my $step = shift; my $return_data; my @sr_repeat = &getRepeat(job=>$jobname,step=>$step); map($_->{xcenter} = $_->{xmin} + $_->{xsize} * 0.5,@sr_repeat); map($_->{ycenter} = $_->{ymin} + $_->{ysize} * 0.5,@sr_repeat); @sr_repeat = sort{$a->{xcenter} <=> $b->{xcenter} || $a->{ycenter} <=> $b->{ycenter}} @sr_repeat; my $dx = 0; my $dy = 0; my $block = 1; my $before_data = undef; foreach my $step (@sr_repeat) { my ($dx_tmp,$dy_tmp); unless($before_data){ $before_data = $step; push @{$return_data->{$block}{data}}, $step; next; } else{ if (abs($step->{xcenter} - $before_data->{xcenter}) < 0.001) { $dy_tmp = sprintf("%.4f",$step->{ycenter} - $before_data->{ycenter} - 0.5*$step->{ysize} - 0.5*$before_data->{ysize}); } else{ $dx_tmp = sprintf("%.4f",$step->{xcenter} - $before_data->{xcenter} - 0.5*$step->{xsize} - 0.5*$before_data->{xsize}); } unless($dx){ $dx = $dx_tmp if ($dx_tmp); } else{ if($dx_tmp and abs($dx - $dx_tmp) > 0.1 ){ $block++; } } unless($dy){ $dy = $dy_tmp if ($dy_tmp); } else{ if($dy_tmp and abs($dy - $dy_tmp) > 0.1 ){ $block++; } } $return_data->{$block}{dx} = $dx; $return_data->{$block}{dy} = $dy; push @{$return_data->{$block}{data}}, $step; $before_data = $step; } } return $return_data; } exit; 我的要求是,现在我希望实现功能:原程序点击确认后,使用ico::isNewProc函数判断是否是分层下卡,不是的话继续原程序;是的话继续判断panel-id层是否存在,不存在的话继续原程序;存在的话则检查层次添加panel-id层,然后继续原程序。有需要修改的,可对这两个代码进行修改。isNewProc直接用,不必管是怎么实现的。
11-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值