代码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直接用,不必管是怎么实现的。