=head
NAME:
DESCRIPTION:
PARAMETER:
{items => [
{
name=>'job',
label=>'料号名',
type=>'editable_enum',
property=>{
tl_field=>[name=>'text'],
tl_data=>[
{name=>'${JOB}',},
{name=>'TL_genesis_work_jobname',},
{name=>'TL_genesis_org_jobname',},
]
},
must_field=>1,
remark=>'程序会根据不同的选择来命名Genesis中的料号名字',
value=>'${JOB}_chk',
},
]}
VERSION_HISTORY:
V1.00 2011-06-13 Janson Zhang
1.新版本
V1.01 2015-11-05 Mast Pei
1.检查铜分布率时,先去除掉之前的值
Ferre -- 已经取消, 做错了,需重做
V1.05 2016-04-14 mast
添加 rigid_flex料号,检查内层是否存在SMD/BGA,并需要手动制作到EP层上
V1.06 2016-10-25 mast pei
修改deleteLayer中的bug
V1.07 2016-11-15 John
Change resolution_value to 10um
V1.09 2017-05-09 mast
系统编号:867
2171 料号触发后台服务
计算每层原稿 PCB的 6X6 /9X9/12X12 区域的 铜分布率分布情况。
1. If the left area less than total area 50% ,can skip the small area .
2.offset as 0.5 times by X , Y and X &Y .
3.The calculate area can set 6*6, 9*9 ,12*12mm
V1.09 2017-12-25 mast
添加ATS_org_pcb_area pcb面积计算
V1.10 2019-05-14 mast
按照SSS添加3x3计算模式
V1.11 2019-08-30 mast
系统需求:2364
consider the rout area to calculate the copper density
V1.12 2020-09-07 John
系统需求:3132
Cancel RF PN
HELP:
功能简介
Create PRE prepare step.
参数配置
● 料号名
设置genesis中料号的名字,${JOB}表示跟TopCAM中的料号名字一样,TL_genesis_work_jobname表示用这个料号属性定义的名字
● step过滤
选择step时候的过滤器
注意事项
●
=cut
#use strict;
#my ($JOB,$GEN,$GUI,$DB,$JOB_ID,$PAR,%ARGS);
use utf8;
use Encode;
use Data::Dump 'dump';
my ($Job,$Step);
my $Return = 'Done';
###确定料号名;
# if (defined $PAR->{job} and ($PAR->{job} eq 'TL_genesis_org_jobname' or $PAR->{job} eq 'TL_genesis_work_jobname')){
# $Job = $DB->get_jobinfo(-jobid=>$JOB_ID,-jobcategory=>'work',-jobinfo=>$PAR->{job});
# }
# elsif(defined $PAR->{job}){
# $Job = $PAR->{job};
# $Job =~ s/\$\{JOB\}/$JOB/g;
# $Job = lc($Job);
# }
# if ( ! defined $Job or $Job =~ /^\s*$/) {
# $GUI->msgbox(-icon=>'error',-text=>'未定义料号名');
# return 'Error';
# }
###处理step过滤
my $customer = $ARGS{CUSTOMER};
$Job=$JOB.'_chk';
my $incam = 'no';
if ($GEN->{GEN_TYPE} eq 'incam') {
$incam = 'yes';
}
my @parameter=('3x3','6x6','9x9','12x12');
my $ORG_job= $JOB.'_org';
my $genesisid = `ps -p $$ -o ppid=`;
$genesisid =~ s/\s//g;
$genesisid = `ps -p $genesisid -o ppid=`;
$genesisid =~ s/\s//g;
try{
###检查Genesis料号是否存在并打开
if (! $GEN->isJobExists(job=>$Job) ){
$GUI->msgbox(-icon=>'error',-text=>"料号 $Job 在Genesis中不存在, 请检查!");
return 'Error';
}
my $user_name =$GEN->getUserName();
if ( $user_name=~/^(cam|check|qm|pe|imp|cam\d+|genesis)$/i){
$GUI->msgbox(-icon=>'error',-text=>"[$user_name]账号不能保存资料,请用可以保存的Genesis账号放行资料");
return 'Error';
}
my $genusername =$GEN->getUserName();
my $check = $GEN->checkInout(job=>$ORG_job,mode=>'test');
if ($genusername ne $check and $check!=0) {
$GUI->msgbox(-icon=>'error',-text=>"$ORG_job 被其他用户锁定,请解锁[$check]");
return 'Error';
}
if ($check ==0) {
$GEN->checkInout(job=>$ORG_job,mode=>'out');
}
$GEN->openJob(job=>$ORG_job);
if ($GEN->{STATUS}){
$GUI->msgbox(-icon=>'error',-text=>"$ORG_job 被[$genusername]打开,请[$genusername]关闭料号");
return 'Error';
}
#$GEN->PAUSE("1111111111111 ");
$GEN->openJob(job=>$Job);
my %matrix=$GEN->getMatrix(job=>$Job,type=>'hash');
#$GUI->debug("$customer $Job");
my @tmp_array1 = {
name=>'add_array_copper',
label=>"Array copper",
type=>'enum',
must_field=>1,
property=>{
tl_field=>['name'=>'text',tl_name=>'scalar'],
tl_value_field=>'tl_name',
tl_data=>[
{name=>'YES',tl_name=>'Yes'},
{name=>'NO',tl_name=>'No'},
]
}
};
my %tmp_array = $GUI->show_form(-title=>'请确认Array边是否有铜',-items=>\@tmp_array1,-defaultsize=>[300,300],-showcheck => 1,-gen => $GEN);
return 'Cancel' unless %tmp_array;
$DB->save_jobinfo(
-jobid=>$JOB_ID,
-jobcategory=>'org',
-jobinfohash=>{'ATS_array_frame_with_copper'=>$tmp_array{add_array_copper}});
my $LAYER_COUNT = $DB->get_jobinfo(-jobid=>$JOB_ID,-jobcategory=>'org',-jobinfo=>'TL_layer_count');
my $ans_array;
my @mode=('card');
if($tmp_array{add_array_copper} eq 'Yes'){
@mode=('card','array');
}
# $GUI->debug("@mode $tmp_array{add_array_copper}");
my @steps = $GEN->getStepList(job=>$Job);
my @step_list;
foreach my $step (@steps){
if ($step!~ /^(.*)(\d{8})\-(\d{6})$/){
push @step_list,$step;
}
}
my @items_step_list;
my (@Probfr,@Probba);
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
push(@Probfr,{name=>$layer}) if($matrix{$layer}{side} eq 'top' and $matrix{$layer}{layer_type} eq 'solder_mask');
push(@Probba,{name=>$layer}) if($matrix{$layer}{side} eq 'bottom' and $matrix{$layer}{layer_type} eq 'solder_mask');
}
push(@Probfr,{name=>'NA'});
push(@Probba,{name=>'NA'});
foreach my $mode (@mode){
push @items_step_list,{
name => $mode,
label => $mode.' Step',
type => 'step',
must_field=>1,
value=>@step_list==1?$step_list[0]:'',
property=>{
tl_steplist=>[@step_list],
},
};
}
my @sminfo;
push @sminfo,
{
name=>'Probfr',
label=>'Probfr Layer',
type=>'enum',
property=>{
tl_field=>[name=>'text'],
tl_value_field=>'name',
tl_data=>\@Probfr,
},
# must_field=>1,
value => $Probfr[0]->{name} ? $Probfr[0]->{name} : 'NA',
},
{
name=>'Probba',
label=>'Probba Layer',
type=>'enum',
property=>{
tl_field=>[name=>'text'],
tl_value_field=>'name',
tl_data=>\@Probba,
},
# must_field=>1,
value => $Probba[0]->{name} ? $Probba[0]->{name} : 'NA',
};
my %info = $GUI->show_form(
-title => "确认[@mode]step/SM ",
-showcheck => 1,
-gen => $GEN,
-items=>[
{type=>'title',property=>{title=>'1.根据您当前step,请匹配step信息'}},
@items_step_list,
{type=>'title',property=>{title=>'2.Please select solder mask layer'}},
@sminfo,
]
);
return 'Cancel' unless %info;
#my $rf_mark= $GUI ->confirm("是否是RF料号");
my $rf_mark= "no";
my $mark_rout_area;
if ($info{card} eq $info{array}) {
@mode=('array','card');
$mark_rout_area='yes';
}
my $rout_copper_array='rout_copper_array';
my $base_copper='base_copper_script';
my $rout_copper='rout_copper_script';
$GEN->openStep(job=>$Job,name=>$steps[0]);
_deleteLayer(step=>$steps[0],layer=>[$rout_copper_array,$base_copper,$rout_copper]);
my %sync_base_copper;
my $pcb_step_tmp;
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{tl_name}) and $matrix{$layer}{tl_name} =~ /^(top|bottom|l\d+)$/ ){
my $tl = $matrix{$layer}{tl_name};
foreach my $att ('TL_array_copper_distribution','TL_card_copper_distribution'){
$DB->save_layerinfo(-jobid=>$JOB_ID,
-tlname=>$tl,
-jobcategory=>'org',
-layerinfohash=>{$att=>''}
);
}
foreach my $att ('TL_array_copper_distribution_add_rout_area','TL_card_copper_distribution_add_rout_area'){
$DB->save_layerinfo(-jobid=>$JOB_ID,
-tlname=>$tl,
-jobcategory=>'org',
-layerinfohash=>{$att=>''}
);
}
}
}
foreach my $checkstep (@mode) {
my $copper_distribution;
my ($area_all,$area_tmp);
if ( $checkstep eq 'array' ) {
$ans_array = $GUI ->confirm('Have array data exists for the copper distribution?');
if ($ans_array eq 'no'){
$mark_rout_area='yes';
next;
}
}
my $step = $info{$checkstep};
$GEN->openStep(job=>$Job,name=>$step);
$GEN->closeStep();
$GEN->openStep(job=>$Job,name=>$step);
$GEN->clearLayers();
$GEN->affectedLayer(mode=>'all',affected=>'no');
$GEN->units(type=>'mm');
$GEN->zoomHome();
#$GEN->closeJob(job=>$ORG_job);
return unless($GEN->PAUSE("Please change the[$Job] [$checkstep] profile to get the copper area for Step [${step}]!"));
#my $ans = $GEN->PAUSE("Please change the [$checkstep] profile to get the copper area for Step [${step}]!");
#unless (defined $ans and $ans eq 'OK' ) {
# return 'Cancel';
#}
# if ($customer eq 'APP' and $checkstep eq 'card' and $incam eq 'no'){
if (
## Open For All PNs at 2018-01-02
#$customer eq 'APP' and
$checkstep eq 'card'){
if ($mark_rout_area ne 'yes') {
my $profile_limits = $GEN->getProfileLimits(job=>$Job,step=>$step,units=>'mm');
my $profile_x=$profile_limits->{xsize};
my $profile_y=$profile_limits->{ysize};
$GEN->createLayer(job=>$Job,layer=>$base_copper,conext=>'misc',type=>'signal')if (!$GEN->isLayerExists(job=>$Job,layer=>$base_copper));
$GEN->units(type=>'inch');
$GEN->srFill(dest=>'layer_name',layer=>$base_copper);
$GEN->units(type=>'mm');
$GEN->workLayer(name=>$base_copper,number=>1);
$GUI->msgbox(-text=>"请给${checkstep}[$step]制作铜面区域;去除Routing区域废铜\n用来计算'3x3','6x6','9x9','12x12' area,不需考虑Routing/Npth避铜问题");
return unless($GEN->PAUSE("Pls delete the dummy copper on routing area of layer [ $base_copper ] by manually"));
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->units(type=>'mm');
$GEN->clearLayers();
$GEN->affectedLayer(mode=>'all',affected=>'no');
$GEN->workLayer(name=>$base_copper,number=>1);
$GEN->selContourize();
#$sync_base_copper{$step}=$base_copper;
push @{$sync_base_copper{$step}},$base_copper if(!grep /@{$sync_base_copper{$step}}/,$base_copper);
$GEN->createLayer(job=>$Job,layer=>$rout_copper,conext=>'misc',type=>'signal')if (!$GEN->isLayerExists(job=>$Job,layer=>$rout_copper));
$GEN->units(type=>'inch');
$GEN->workLayer(name=>$rout_copper,number=>1);
$GEN->srFill(dest=>'layer_name',layer=>$rout_copper);
$GEN->units(type=>'mm');
if ($GEN->isLayerExists(job=>$Job,layer=>$base_copper)) {
#$GEN->COM('sel_resize',size=>-4000,corner_ctl=>'no');
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$base_copper,
dest_layer=>$rout_copper,
invert=>'yes',
mode=>'append',
);
$GEN->selContourize();
$GEN->COM('sel_resize',size=>-4000,corner_ctl=>'no');
}
}
else{
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>[$base_copper,$rout_copper],clear_before=>'yes');
$GEN->COM('clip_area_strt');
$GEN->COM('clip_area_end,layers_mode=affected_layers,layer=,area=profile,area_type=rectangle,inout=outside,contour_cut=no,margin=0');
}
my $copper_area = $GEN->copperArea(layer1=>$base_copper,resolution_value=>10);
my $area =sprintf ('%.4f',$copper_area->{area} / 10000); ### units: dm2
$DB->save_jobinfo(
-jobid=>$JOB_ID,
-jobcategory=>'org',
-jobinfohash=>{'ATS_org_pcb_area'=>$copper_area->{area}/0.00001});
$GEN->saveJob(job=>$Job);
if ($incam ne 'no') {
$GEN->checkInout(job=>$Job,mode=>'in');
$GEN->checkInout(job=>$Job,mode=>'out');
}
unless ($GEN->{STATUS}){
$pcb_step_tmp = $step;
}
}
elsif ($mark_rout_area eq 'yes') {
my $profile_limits = $GEN->getProfileLimits(job=>$Job,step=>$step,units=>'mm');
my $profile_x=$profile_limits->{xsize};
my $profile_y=$profile_limits->{ysize};
my $base_copper='base_copper_script';
$GEN->createLayer(job=>$Job,layer=>$base_copper,conext=>'misc',type=>'signal')if (!$GEN->isLayerExists(job=>$Job,layer=>$base_copper));
$GEN->units(type=>'inch');
$GEN->srFill(dest=>'layer_name',layer=>$base_copper);
$GEN->units(type=>'mm');
$GEN->workLayer(name=>$base_copper,number=>1);
$GUI->msgbox(-text=>"请给${checkstep}[$step]制作铜面区域;去除Routing区域废铜\n用来计算'3x3','6x6','9x9','12x12' area,不需考虑Routing/Npth避铜问题");
return unless($GEN->PAUSE("Pls make copper on [$base_copper],use cal '3x3','6x6','9x9','12x12' area"));
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->units(type=>'mm');
$GEN->clearLayers();
$GEN->affectedLayer(mode=>'all',affected=>'no');
$GEN->workLayer(name=>$base_copper,number=>1);
$GEN->selContourize();
$GEN->createLayer(job=>$Job,layer=>$rout_copper,conext=>'misc',type=>'signal')if (!$GEN->isLayerExists(job=>$Job,layer=>$rout_copper));
$GEN->units(type=>'inch');
$GEN->workLayer(name=>$rout_copper,number=>1);
$GEN->srFill(dest=>'layer_name',layer=>$rout_copper);
$GEN->units(type=>'mm');
if ($GEN->isLayerExists(job=>$Job,layer=>$base_copper)) {
$GEN->COM('sel_resize',size=>-4000,corner_ctl=>'no');
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$base_copper,
dest_layer=>$rout_copper,
invert=>'yes',
mode=>'append',
);
$GEN->selContourize();
$GEN->COM('sel_resize',size=>-4000,corner_ctl=>'no');
#$sync_base_copper{$step}=$rout_copper;
push @{$sync_base_copper{$step}},$rout_copper if(!grep /@{$sync_base_copper{$step}}/,$rout_copper);
}
push @{$sync_base_copper{$step}},$base_copper if(!grep /@{$sync_base_copper{$step}}/,$base_copper);
$GEN->openJob(job=>$ORG_job);
my @org_steps = $GEN->getStepList(job=>$ORG_job);
foreach my $step (keys %sync_base_copper){
if ($GEN->isStepExists(job=>$ORG_job,step=>$step) ) {
$GEN->openStep(job=>$ORG_job,name=>$step);
foreach my $f (@{$sync_base_copper{$step}}){
my $f1 ='ats_rout_copper_ref' if ($f=~/rout_copper/);
$f1 ='ats_base_copper_ref' if ($f=~/base_copper/);
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$f,
dest_layer=>$f1,
);
}
$GEN->closeStep();
}
else{
my $step1 = $GUI->select_step(
-title => "[$step]所对应的${ORG_job}中的Step",
-steplist => [@org_steps],
);
return 'Cancel' unless ( $step1);
$GEN->openStep(job=>$ORG_job,name=>$step1);
foreach my $f (@{$sync_base_copper{$step}}){
my $f1 ='ats_rout_copper_ref' if ($f=~/rout_copper/);
$f1 ='ats_base_copper_ref' if ($f=~/base_copper/);
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$f,
dest_layer=>$f1,
);
}
$GEN->closeStep();
}
}
$GEN->closeJob(job=>$ORG_job)
}
my (%copper_distribution,%copper_distribution_add_rout);
$GEN->openStep(job=>$Job,name=>$step);
$GEN->units(type=>'mm');
$GEN->clearLayers();
$GEN->affectedLayer(mode=>'all',affected=>'no');
my $tmp_copper='ats_script_copper';
my ($layer_profile,@have_sel_line);
while(1){
my $mm;
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{tl_name}) and $matrix{$layer}{tl_name} =~ /^(top|bottom|l\d+)$/ ){
$mm++;
_deleteLayer(step=>$step,layer=>[$tmp_copper]);
if ($rf_mark =~/yes/i and $checkstep eq 'card' and $mm==1){
if (!$layer_profile){
$GUI->msgbox(-icon=>'info',-text=>"RF JOB:请确认硬板区域out层的线宽不一样.");
my $ans = $GEN->PAUSE("RF job:Pls change.");
unless (defined $ans and $ans eq 'OK' ) {
return 'Cancel';
}
$layer_profile = $GUI->select_layer(-title=>'选择硬板区域out层',
-layermatrix=>{$GEN->getMatrix(job=>$Job,type=>'hash')},
-selectmode => 'single');
return 'Cancel' if(!$layer_profile);
my %symlist = $GEN->getLayerSymsHist(job=>$Job,step=>$step,layer=>$layer_profile,units=>"mm");
foreach my $symbol (keys %symlist) {
if ( $symlist{$symbol}{line} > 0 or $symlist{$symbol}{arc} > 0 ) {
push @have_sel_line,$symbol if (!grep /$symbol$/,@have_sel_line);
}
}
}
$GEN->affectedLayer(affected=>'yes',mode=>'single',layer=>[$layer_profile],clear_before=>'yes');
$GEN->selectByFilter(
feat_types=>'line\;arc',
include_syms=>$have_sel_line[0],
);
@have_sel_line=grep{$_ ne $have_sel_line[0]}@have_sel_line;
if ($GEN->getSelectCount()>0){
$GEN->COM('sel_create_profile');
$GEN->affectedLayer(mode=>'all',affected=>'no');
}
else{
$GUI->msgbox(-icon=>'error',-text=>"profile没有定义成功");
return 'Error';
}
# $GEN->PAUSE("11111111111111");
_deleteLayer(step=>$step,layer=>['rf_ats_script_copper']);
$GEN->COM('create_layer',layer=>'rf_ats_script_copper') if (!$GEN->isLayerExists(job=>$Job,layer=>'rf_ats_script_copper'));
_copperFill('rf_ats_script_copper','solid','',0.0254,0.0254,'positive',0,0,0,0,'no');
$GEN->units(type=>'mm');
my $copper_area = $GEN->copperArea(layer1=>'rf_ats_script_copper',resolution_value=>10);
$copper_distribution{$matrix{$layer}->{tl_name}}{area_all}+=$copper_area->{area} if ($rf_mark =~/yes/i);
}
# $GUI->debug(dump \%copper_distribution);
$GEN->flattenLayer(source_layer=>$layer,target_layer=>$tmp_copper);
$GEN->workLayer(name=>$tmp_copper,number=>1);
$GEN->COM('clip_area_strt');
# $GEN->PAUSE("$copper_area->{area} $layer ");
$GEN->COM('clip_area_end',layers_mode=>'affected_layers',
# layer=>'',
area=>'profile',
area_type=>'rectangle',
inout=>'outside',
contour_cut=>'yes',
margin=>0);
# $GUI->debug(dump \%copper_distribution);
$GEN->units(type=>'mm');
my $copper_area = $GEN->copperArea(layer1=>$tmp_copper,resolution_value=>10);
$copper_distribution{$matrix{$layer}->{tl_name}}{area_tmp}+=$copper_area->{area} if ($rf_mark =~/yes/i);
$copper_distribution{$matrix{$layer}->{tl_name}}{area_all}=$copper_distribution{'top'}{area_all} if ($rf_mark =~/yes/i);
$copper_distribution{$matrix{$layer}->{tl_name}}{percent}=$copper_area->{percent};
if (grep /^card$/,@mode and $checkstep eq 'array') {
if (!$GEN->isLayerExists(job=>$Job,layer=>$rout_copper_array)) {
if ($GEN->isLayerExists(job=>$Job,layer=>$rout_copper)) {
$GEN->flattenLayer(source_layer=>$rout_copper,target_layer=>$rout_copper_array);
}
}
if (!$GEN->isLayerEmpty(job=>$Job,step=>$step,layer=>$rout_copper_array)){
push @{$sync_base_copper{$step}},$rout_copper_array if(!grep /@{$sync_base_copper{$step}}/,$rout_copper_array);
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$rout_copper_array,
dest_layer=>$tmp_copper,
mode=>'append');
my $copper_area1 = $GEN->copperArea(layer1=>$tmp_copper,resolution_value=>10);
$copper_distribution_add_rout{$matrix{$layer}->{tl_name}}{percent}+=$copper_area1->{percent};
}
}
elsif ($GEN->isLayerExists(job=>$Job,layer=>$rout_copper)) {
if (!$GEN->isLayerEmpty(job=>$Job,step=>$step,layer=>$rout_copper)){
push @{$sync_base_copper{$step}},$rout_copper if(!grep /@{$sync_base_copper{$step}}/,$rout_copper);
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$rout_copper,
dest_layer=>$tmp_copper,
#invert=>'yes',
mode=>'append',
);
my $copper_area1 = $GEN->copperArea(layer1=>$tmp_copper,resolution_value=>10);
$copper_distribution_add_rout{$matrix{$layer}->{tl_name}}{percent}+=$copper_area1->{percent};
}
}
}
}
if ($rf_mark !~/yes/i ){
last;
}
elsif ($rf_mark =~/yes/i){
last if (!@have_sel_line);
}
}
# $GUI->debug(dump \%copper_distribution);
foreach my $tl(keys %copper_distribution){
if (defined $copper_distribution{$tl}{area_tmp} and defined $copper_distribution{$tl}{area_all}){
my$rr=sprintf("%.3f",($copper_distribution{$tl}{area_tmp}/$copper_distribution{$tl}{area_all})*100);
$DB->save_layerinfo(-jobid=>$JOB_ID,
-tlname=>$tl,
-jobcategory=>'org',
-layerinfohash=>{'TL_'.$checkstep.'_copper_distribution'=>$rr}
);
}
else{
$DB->save_layerinfo(-jobid=>$JOB_ID,
-tlname=>$tl,
-jobcategory=>'org',
-layerinfohash=>{'TL_'.$checkstep.'_copper_distribution'=>$copper_distribution{$tl}{percent}}
);
$DB->save_layerinfo(-jobid=>$JOB_ID,
-tlname=>$tl,
-jobcategory=>'org',
-layerinfohash=>{'TL_'.$checkstep.'_copper_distribution_add_rout_area'=>$copper_distribution_add_rout{$tl}{percent}}
) if ($copper_distribution_add_rout{$tl}{percent});
}
}
_deleteLayer(step=>$step,layer=>['script_tmp']);
if ( $checkstep eq 'card' ) {
if ($rf_mark =~/yes/i){
my $ans = $GEN->PAUSE("RF job:Please change the [$checkstep] profile to get the SM point for Step [${step}] all !");
unless (defined $ans and $ans eq 'OK' ) {
return 'Cancel';
}
}
next if ($info{Probfr} eq 'NA' and $info{Probba} eq 'NA');
foreach my $layer ($info{Probfr},$info{Probba}) {
next if ($layer eq 'NA');
#转标准层名 存入数据库
my $standard_layer_name=$matrix{$layer}->{tl_name};
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$layer,
dest_layer=>$layer.'1',
mode=>'replace');
$GEN->zoomHome();
$GEN->workLayer(name=>$layer.'1',number=>1);
$GEN->selBreak();
$GEN->selContourize();
$GEN->COM('sel_decompose',overlap=>'yes');
$GEN->COM('clip_area_strt');
$GEN->COM('clip_area_end,layers_mode=affected_layers,layer=,area=profile,area_type=rectangle,inout=outside,contour_cut=no,margin=0');
$GEN->selectByFilter(
feat_types=>'surface',
profile=>'in',
);
#$GEN->PAUSE("opop fffff 55555");
my $num = $GEN->getSelectCount();
#$GEN->PAUSE("opop fffff 55555 $num");
#$GEN->COM('reread_layer',layer=>$layer);
$DB->save_layerinfo(-jobid=>$JOB_ID,
-tlname=>$standard_layer_name,
-jobcategory=>'org',
-layerinfohash=>{'ATS_sm_opening_num'=>$num,}
);
}
}
}
$GEN->clearLayers();
$GEN->affectedLayer(mode=>'all',affected=>'no');
my @org_steps = $GEN->getStepList(job=>$ORG_job);
if ($mark_rout_area ne 'yes'){
$GEN->openJob(job=>$ORG_job);
foreach my $step (keys %sync_base_copper){
if ($GEN->isStepExists(job=>$ORG_job,step=>$step) ) {
$GEN->openStep(job=>$ORG_job,name=>$step);
foreach my $f (@{$sync_base_copper{$step}}){
my $f1 ='ats_rout_copper_ref' if ($f=~/rout_copper/);
$f1 ='ats_base_copper_ref' if ($f=~/base_copper/);
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$f,
dest_layer=>$f1,
);
}
}
else{
my $step1 = $GUI->select_step(
-title => "[$step]所对应的${ORG_job}中的Step",
-steplist => [@org_steps],
);
return 'Cancel' unless ( $step1);
$GEN->openStep(job=>$ORG_job,name=>$step1);
foreach my $f (@{$sync_base_copper{$step}}){
my $f1 ='ats_rout_copper_ref' if ($f=~/rout_copper/);
$f1 ='ats_base_copper_ref' if ($f=~/base_copper/);
$GEN->copyLayer(source_job=>$Job,
source_step=>$step,
source_layer=>$f,
dest_layer=>$f1,
);
}
}
}
$GEN->closeStep();
}
$GEN->openStep(job=>$ORG_job,name=>$org_steps[0]);
$GEN->saveJob(job=>$ORG_job);
$GEN->checkInout(job=>$ORG_job,mode=>'in');
$GEN->closeJob(job=>$ORG_job);
if ($GEN->{STATUS}){
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
###output and return status, if genesis error, it will output genesis error command
unless ($GEN->{STATUS}){
if ($pcb_step_tmp) {
my $return1 = $DB->insert(
-table=>'ats_genesis_background_server',
-data=>{
job_name=>$Job,
step_name=>$pcb_step_tmp,
status=> 'Active',
use_mode => 'check_pcb_copper_density',
try_times=>1,
layer_name => '',
job_id=>$JOB_ID,
cam_user=>$APP->{USER_NAME},
process_id=>$ARGS{process_id},
parameter=>(dump @parameter),
},
-return=>['id'],
);
if (!$return1->{id}){
$GUI->msgbox(-icon=>'error',-text=>"Update database error,请重新申请");
return 'Error';
}
if ($GEN->{STATUS}){
$GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}}));
return 'Error';
}
}
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 _deleteLayer{
my %par = @_;
foreach my $layer(@{$par{layer}}){
$GEN->deleteLayer(layer=>$layer) if ($GEN->isLayerExists(job=>$Job,layer=>$layer));
}
$GEN->openStep(job=>$Job,name=>$par{step}) if ($par{step});
}
sub _copperFill {
my $layer = shift;
my $type = shift;
my $symbol = shift;
my $dx = shift;
my $dy = shift;
my $polarity = shift;
my $step_x = shift;
my $step_y = shift;
my $sr_x = shift;
my $sr_y = shift;
my $consider_feat = (shift or 'yes');
my $feat_margin = (shift or 0.03);
$GEN->COM('fill_params',
type=>$type,
origin_type=>"datum",
solid_type=>"surface",
min_brush=>1,
use_arcs=>"yes",
symbol=>$symbol,
dx=>$dx,
dy=>$dy,
break_partial=>"yes",
cut_prims=>"no",
outline_draw=>"no",
outline_width=>0,
outline_invert=>"no");
$GEN->COM('sr_fill',
polarity=>$polarity,
step_margin_x=>$step_x,
step_margin_y=>$step_y,
step_max_dist_x=>100,
step_max_dist_y=>100,
sr_margin_x=>$sr_x,
sr_margin_y=>$sr_y,
sr_max_dist_x=>0,
sr_max_dist_y=>0,
nest_sr=>"no",
consider_feat=>$consider_feat,
feat_margin=>$feat_margin,
consider_drill=>"no",
drill_margin=>0,
consider_rout=>"no",
dest=>'layer_name',
layer=>$layer,
attributes=>"no");
}