Commit 55212463 authored by Scott Sun's avatar Scott Sun

scott

parent 59890c98
=head
NAME:
DESCRIPTION: 检查钻孔Pad大小.
PARAMETER:
{items => [
{
name=>'job',
label=>'原稿检查料号名',
type=>'editable_enum',
property=>{
tl_field=>[name=>'text'],
tl_data=>[
{name=>'${JOB}',},
{name=>'${JOB}_org',},
{name=>'${JOB}_chk',},
{name=>'${JOB}_pre',},
]
},
remark=>'原稿检查料号名',
must_field=>1,
value=>'',
},
]}
VERSION_HISTORY:
V1.00 2011-05-27 Tony Guo
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 检查原稿最小线宽线距.</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<font color="#008000"><p> ● 原稿检查料号名</p></font>
<p> 设置原稿料号名,如:${JOB}_chk;其中${JOB}是代表系统中的料号名.</p>
<font color="#008000"><p> ● CheckList名称</p></font>
<p> 设置CheckList名称.</p>
<font color="#008000"><p> ● Drill Summary CheckList编号</p></font>
<p> 设置Drill Summary CheckList编号.</p>
<br>
</body></html>
=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;
my $matrix;
my $max_via_size = 160;
try {
#确定料号名;
if(defined $PAR->{job}){
$Job = $PAR->{job};
$Job =~ s/\$\{JOB\}/$JOB/g;
}
if (!defined $Job or $Job =~ /^\s*$/){
$GUI->msgbox(-icon=>'error',-text=>'未定义料号名');
return 'Error';
}
my $layercount = $DB->get_jobinfo(-jobid=>$JOB_ID,
-jobcategory=>'org',
-jobinfo=>'TL_layer_count');
if ($layercount == 2){
$GUI->msgbox(-text=>"2层板不存在Stack 结构的孔");
$DB->save_jobinfo( -jobid=>$JOB_ID,-jobcategory=>'org',
-jobinfohash=>{ATS_max_laser_stack_num=>0});
return $Return;
}
#判断料号是否存在;
unless ($GEN->isJobExists(job=>$Job)){
$GUI->msgbox(-icon=>'error',-text=>"料号[$Job]不存在!");
return 'Error';
}
$GEN->openJob(job=>$Job);
$GEN->PAUSE("Before Run Script,Drill matrix must be right!And make sure no outline on Drill layers!");
my @steps = $GEN->getStepList(job=>$Job);
my @selstep;
if (@steps != 1){
@selstep = $GUI->select_step(-title=>'请选择包含钻孔信息的Step',-steplist=>\@steps,-selectmode=>'multiple');
return 'Cancel' unless @selstep;
}
else{
@selstep = @steps;
}
#my %matrix = $GEN->getMatrix(job=>$Job);
my %matrix=$GEN->getMatrix(job=>$Job,type=>'hash');
############得到钻孔的层###########
my %drill_info;
foreach my $step(@selstep){
foreach my $drill (sort {$matrix{$a}{row} <=>$matrix{$b}{row}} keys %matrix){
if ($matrix{$drill}{context} eq 'board' and $matrix{$drill}{layer_type} eq 'drill' ){
$drill_info{$step}{$drill} = $matrix{$drill};
if ($drill_info{$step}{$drill}{drl_start_num} > $drill_info{$step}{$drill}{drl_end_num}) {
($drill_info{$step}{$drill}{drl_start_num},$drill_info{$step}{$drill}{drl_end_num}) = ($drill_info{$step}{$drill}{drl_end_num},$drill_info{$step}{$drill}{drl_start_num});
$drill_info{$step}{$drill}{tl_name} = 'drill'.$drill_info{$step}{$drill}{drl_start_num}.'-'.$drill_info{$step}{$drill}{drl_end_num};
}
}
}
}
my %include_symbol;
my %laser_layer;
my %sel_layer;
foreach my $step(@selstep){
$GEN->openStep(job=>$Job,name=>$step);
$GEN->units(type=>'mm');
foreach my $layer(sort {$drill_info{$step}{$a}{drl_start_num} <=>$drill_info{$step}{$b}{drl_start_num} || $drill_info{$step}{$a}{drl_end_num} <=>$drill_info{$step}{$b}{drl_end_num}} keys %{$drill_info{$step}}){
$GEN->workLayer(name=>$layer,clear_before=>'yes');
my @features = $GEN->getFeatures(job=>$Job,step=>$step,layer=>$layer,units=>'mm');
foreach my $size(@features){
if ($size->{symbol}=~/r(\d+.?\d+)/i){
if($1 < $max_via_size){
if (!grep /$1/,@{$include_symbol{$step}{$layer}}){
push @{$include_symbol{$step}{$layer}},"r".$1;
}
}
}
}
if ( not @{$include_symbol{$step}{$layer}}){
next;
}
$GEN->COM('filter_set',filter_name=>"popup",update_popup=>"no",include_syms=>join(";",@{$include_symbol{$step}{$layer}}));
$GEN->COM('filter_area_end',layer=>$layer,filter_name=>"popup",operation=>"select",area_type=>"none",inside_area=>"no",
intersect_area=>"no",lines_only=>"no",ovals_only=>"no",min_len=>0,max_len=>0,min_angle=>0,max_angle=>0);
my $nnn;
if ($GEN->getSelectCount()>0){
foreach my $num($drill_info{$step}{$layer}{drl_start_num}..$drill_info{$step}{$layer}{drl_end_num}-1){
$GEN->COM('filter_area_end',layer=>$layer,filter_name=>"popup",operation=>"select",area_type=>"none",inside_area=>"no",
intersect_area=>"no",lines_only=>"no",ovals_only=>"no",min_len=>0,max_len=>0,min_angle=>0,max_angle=>0);
$nnn=$num+1;
my $tmp_layer = "scr_drl_".$num."_".$nnn;
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$tmp_layer);
$laser_layer{$step}{$tmp_layer}{start_num} = $num;
$laser_layer{$step}{$tmp_layer}{end_num} = $nnn;
push @{$sel_layer{$step}},$tmp_layer if (!grep /$tmp_layer/,@{$sel_layer{$step}});
}
}
}
my $sym = "r120";
foreach my $change_layer(@{$sel_layer{$step}}){
$GEN->workLayer(name=>$change_layer,clear_before=>'yes');
$GEN->selChangeSym(symbol=>$sym);
}
$GEN->closeStep();
}
# $GUI->debug(dump(\%laser_layer));
# $GUI->debug(dump(keys %sel_layer));
# return;
my @layer;
my %laser_stack;
my $tmp_layer = "script_tmp";
# foreach my $step(keys %sel_layer){
foreach my $step(keys %laser_layer){
$GEN->openStep(job=>$Job,name=>$step);
my $i=0;
if (@{$sel_layer{$step}}<2){
$GEN->deleteLayer(step=>$step,job=>$Job,layer=>"scr_drl_1_2") if ($GEN->isLayerExists(job=>$Job,layer=>"scr_drl_1_2"));
$GEN->closeStep();
next;
}
foreach my $layer(@{$sel_layer{$step}}){
my ($sta,$end) = $layer =~ /scr_drl_(\d+)_(\d+)/i;
my $j = $i;
my $sel_count = 0;
$j=$j+1;
my $cul_layer = $layer;
$GEN->copyLayer(source_job=>$Job,source_step=>$step,source_layer=>$cul_layer,dest_layer=>$tmp_layer,mode=>'replace');
while($j<=@{$sel_layer{$step}}){
$GEN->workLayer(name=>$tmp_layer,clear_before=>'yes');
my $next_layer = $sel_layer{$step}[$j];
my $tmp = $sel_layer{$step}[$j-1];
if ($laser_layer{$step}{$tmp}{end_num} == $laser_layer{$step}{$next_layer}{start_num}){
$GEN->selRefFeat(
layers=>$next_layer,
use=>'filter',
# mode=>'touch',
mode=>'cover',
f_types=>'pad',
polarity=>'positive',
filter=>{feat_types=>'pad',
polarity=>'positive',
},
);
if ($GEN->getSelectCount()>0){
$sel_count++;
$GEN->selReverse();
$GEN->selDelete() if($GEN->getSelectCount()>0);
}else{
last;
}
}else{
last;
}
$j++;
}
$GEN->deleteLayer(job=>$Job,step=>$step,layer=>$step.'_drl'.$sta.'_'.$end."_stack_laser") if ($GEN->isLayerExists(job=>$Job,layer=>$step.'_drl'.$sta.'_'.$end."_stack_laser"));
if ($sel_count >= 11) {
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$step.'_drl'.$sta.'_'.$end."_stack_laser");
}
$GEN->deleteLayer(job=>$Job,step=>$step,layer=>$tmp_layer) if ($GEN->isLayerExists(job=>$Job,layer=>$tmp_layer));
$laser_stack{$step}{$layer} = $sel_count;
$i++;
}
$GEN->closeStep();
}
# $GUI->debug(dump(\%laser_stack));
# return;
my $max_stack_via = 0;
foreach my $step (keys %laser_stack){
foreach my $layer(keys %{$laser_stack{$step}}){
$GEN->deleteLayer(job=>$Job,step=>$step,layer=>$layer) if ($GEN->isLayerExists(job=>$Job,layer=>$layer));
if ($max_stack_via < $laser_stack{$step}{$layer}){
$max_stack_via = $laser_stack{$step}{$layer};
}
}
}
# $GUI->debug(dump(%laser_stack));
if ($max_stack_via == 0){
$GUI->msgbox(-text=>"此板不存在Stack 结构的孔");
}
$DB->save_jobinfo( -jobid=>$JOB_ID,-jobcategory=>'org',
-jobinfohash=>{ATS_max_laser_stack_num=>$max_stack_via});
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{
};
__END__
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
## 2171 ok
* 2171是tgz格式 已经有外形
## yucca
比较复杂 规律难总结
一些参考料号 20444453_220 88880010_110 88880033_133
没有合适的 fab层创建 规则
## vivo ok
```
先判断 有没有line层 有line层选择line层创建
没line层找top层 判断top层是否有外框 有外框选择外框创建
```
## Wistron ok
判读有没有outline层 全选outline层创建
有没有 contour 层 过滤contour层上边的描述框后创建
## 1352 ok
使用之前的做法
\ No newline at end of file
......@@ -167,10 +167,31 @@ if(mailUserList && mailUserList.length) {
var cam_workflow_info = IKM.get_jobinfo({jobid:JobId, jobinfo:"cam_workflow_info"});
console.log("==========cam_workflow_info===========:" + cam_workflow_info);
try {
// if(cam_workflow_info == "err"){ // ! tmp
// console.log("==========cam_workflow_info===========:" + cam_workflow_info);
// throw cam_workflow_info
// }
if(cam_workflow_info == "err" && global._STATUS == "err"){
console.log("==========cam_workflow_info===========:" + cam_workflow_info);
throw cam_workflow_info
}
if(global._STATUS != "err") {
// 清空报错信息
var job_attrs = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field_format:{job_attrs:'json'},
field:'job_attrs',
where:{id : JobId}
})
});
if (!job_attrs ) { job_attrs = {}}
job_attrs.readin_result = "Readin"
db.query("",function(q){
return q.updateRow({
table:'pdm_job',
data:{job_attrs:job_attrs},
update_policy:{attr_data:'json_merge'},
where:{id : JobId}
})
});
}
cam_workflow_info = "sendmail"
console.log("=============================================>anaysis_start");
var par = PAR;
......@@ -670,6 +691,11 @@ try {
GEN.COM("chklist_run,chklist=valor_cleanup_set_smd,nact=1,area=profile")
GEN.COM("chklist_close,chklist=valor_cleanup_set_smd,mode=hide")
}else{
// GEN.chklistRun({
// chklist: "quotation_check",
// nact: 4,
// area: 'profile'
// })
GEN.COM("chklist_single,show=yes,action=valor_cleanup_set_smd")
GEN.COM("chklist_cupd,chklist=valor_cleanup_set_smd,nact=1,params=((pp_layer=.type=signal|mixed&side=top|bottom)(pp_work_on=SMD\;BGA)(pp_delete=No)(pp_types=Square\;Rect\;Oval)(pp_other_smd=)(pp_sm=No)(pp_drill=)(pp_rotate=No)(pp_ignore_covered=Yes)(pp_bga_types=Round)(pp_other_bga=)(pp_sm_bga=No)(pp_bga_max_pitch=70)(pp_bga_actions=Set attribute)(pp_bga_suffix=_bga)(pp_identify_gf=)),mode=regular")
GEN.COM("get_user_name")
......@@ -787,10 +813,20 @@ try {
GEN.closeStep()
}
})
// var info = {
// min_line_width: ["line","user_nor_line"],
// min_line_spacing: ["c2c","l2l","user_nor_line2nor_line"],
// min_line2pad: ["p2line","user_010052nor_line","user_bga2nor_line-1","user_smd2nor_line","user_self_spacing_smd2l"],
// min_pad2pad: ["p2p", "smd2smd", "smd2pad","via2via","bga2pad"],
// min_ar_laser:["laser_via_ar"],
// min_ar_via:["via_ar"],
// min_ar_pth:["pth_ar"],
// min_ar_npth:["npth_ar"]
// }
var info = {
min_line_width: ["line","user_nor_line"],
min_line_spacing: ["c2c","l2l","user_nor_line2nor_line"],
min_line2pad: ["p2line","user_010052nor_line","user_bga2nor_line-1","user_smd2nor_line","user_self_spacing_smd2l"],
min_line2pad: ["p2line","p2c"],
min_pad2pad: ["p2p", "smd2smd", "smd2pad","via2via","bga2pad"],
min_ar_laser:["laser_via_ar"],
min_ar_via:["via_ar"],
......@@ -808,7 +844,7 @@ try {
// } else {
// jobpath = "/home/local_db/server_db/jobs/"+job
// }
mkPath(jobpath,["user","opcam","steps"])
// mkPath(jobpath,["user","opcam","steps"])
script_info({ msg: "Error-Signal layer analysis" })
script_info({ progress: 85 })
stepList.forEach(function(step){
......@@ -940,36 +976,50 @@ try {
console.log("==================================> chk signals analysis")
// 创建chklist并运行 如果chklist存在先删除
if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) {
GEN.COM("chklist_delete", { chklist: oChecklistName })
}
var tmpitem = {
name: "signal_layer_checks",
nact: 1,
action: "valor_analysis_signal",
params: {
pp_layer: ".affected",
pp_spacing: 20,
pp_selected: "All",
pp_r2c: 10,
pp_d2c: 15,
pp_sliver: 8,
pp_min_pad_overlap: 5,
pp_check_missing_pads_for_drills: "Yes",
pp_use_compensated_rout: "Skeleton",
pp_sm_spacing: "Yes"
}
}
if(par.erf){
tmpitem.erf = par.erf
}
// var tmpitem = {
// name: "signal_layer_checks",
// nact: 1,
// action: "valor_analysis_signal",
// params: {
// pp_layer: ".affected",
// pp_spacing: 20,
// pp_selected: "All",
// pp_r2c: 10,
// pp_d2c: 15,
// pp_sliver: 8,
// pp_min_pad_overlap: 5,
// pp_check_missing_pads_for_drills: "Yes",
// pp_use_compensated_rout: "Skeleton",
// pp_sm_spacing: "Yes"
// }
// }
// if(par.erf){
// tmpitem.erf = par.erf
// }
// createChklistAndRun({ // 创建checklist并运行
// layers: signalLayers,
// items: [tmpitem]
// })
script_info({ msg: "Error-Run Checklist",result_severity:"ok" })
createChklistAndRun({ // 创建checklist并运行
layers: signalLayers,
items: [tmpitem]
// if (GEN.isChklistExists({ job: job, step: step, chklist: oChecklistName })) {
// GEN.COM("chklist_delete", { chklist: oChecklistName })
// }
GEN.COM("chklist_from_lib,chklist=quotation_check,profile=none,customer=")
GEN.chklistRun({
chklist: "quotation_check",
nact: 1,
area: 'profile'
})
GEN.chklistRun({
chklist: "quotation_check",
nact: 2,
area: 'profile'
})
// signal层分析结果
var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:oChecklistName,jobpath:jobpath})
script_info({ msg: "Error-get ChkRes",result_severity:"ok" })
var res = analysisChkAttr({layers:signalLayers, info:info, step:step, job:job, oChecklistName:"quotation_check",jobpath:jobpath})
// 数据入库
Object.keys(res).forEach(function(key){
var val = res[key]
......@@ -988,7 +1038,7 @@ try {
})
GEN.closeStep()
})
mvOutProfile({job:job, step:pcs_step})
// mvOutProfile({job:job, step:pcs_step})
// 保存
if(/yes/ig.test(par.auto_save)){
......@@ -1022,20 +1072,20 @@ try {
script_info({ progress: 95 })
script_info({ msg: "analysis done" })
// 导出
if(par.export_path != "" && par.export_mode != "" && par.export_submode != "" ){
if(fs.exists(par.export_path)){
if(GEN.GEN_TYPE == "genesis"){
GEN.COM("export_job,job="+job+",path="+par.export_path+",mode="+par.export_mode+",submode="+par.export_submode+",overwrite=yes")
} else {
GEN.COM("export_job",{job:job,path:par.export_path,mode:par.export_mode,submode:par.export_submode,overwrite:"yes",format:"genesis",output_name:job})
GEN.COM("disp_on")
GEN.COM("origin_on")
}
} else {
resultData.push({ type: "error", title: "导出路径不存在!", detail: [{ desc: par.export_path }] });
}
}
//! means信息无法导出
// if(par.export_path != "" && par.export_mode != "" && par.export_submode != "" ){
// if(fs.exists(par.export_path)){
// if(GEN.GEN_TYPE == "genesis"){
// GEN.COM("export_job,job="+job+",path="+par.export_path+",mode="+par.export_mode+",submode="+par.export_submode+",overwrite=yes")
// } else {
// GEN.COM("export_job",{job:job,path:par.export_path,mode:par.export_mode,submode:par.export_submode,overwrite:"yes",format:"genesis",output_name:job})
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// }
// } else {
// resultData.push({ type: "error", title: "导出路径不存在!", detail: [{ desc: par.export_path }] });
// }
// }
// 邮件触发
sendEmail({
......@@ -2053,7 +2103,8 @@ function analysisChkAttr(par) {
var job = par.job;
var oChecklistName = par.oChecklistName
layers.forEach(function (v) {
saveMeans({job:job,step:par.step,chklist:oChecklistName,nact:1,layer:v,jobpath:par.jobpath})
var nact = /top|bot/.test(v) ? 1 : 2;
// saveMeans({job:job,step:par.step,chklist:oChecklistName,nact:nact,layer:v,jobpath:par.jobpath})
hash[v] = {}
Object.keys(info).forEach(function (key) {
var val = info[key]
......@@ -2062,7 +2113,7 @@ function analysisChkAttr(par) {
job: job,
step: par.step,
checklist: oChecklistName,
nact: 1,
nact: nact,
attr: v + "_min_" + type
})
console.log("===================== " + v + "_min_" + type + " -> " + tmp);
......@@ -2081,6 +2132,8 @@ function analysisChkAttr(par) {
}
})
})
exportInfo(hash)
return hash
}
function analysisDrill(par, step){
......
This diff is collapsed.
......@@ -325,7 +325,6 @@ try {
GEN.COM("input_manual")
})
}
importOk = true
}
if(!importOk){ throw "import error"}
......@@ -557,7 +556,6 @@ function reNameStep(job) {
})
}
function script_info(props){ // result_severity progress
if (mode === "aimdfm") {
$.QDfm.updateRow({
......@@ -584,6 +582,7 @@ function decompression(path, zips) {
item.path = item.dir + "/" + mvname
}
var dir_name = item.path.replace(/\.(zip|7z|rar)$/, "");
autoUn(item.path, dir_name);
return true
}
......@@ -605,8 +604,6 @@ function changePath(path) {
}
function autoUn(path, dirname) {
console.log("=====path: " + path);
console.log("=====dirname: " + dirname);
if(/\.rar$/.test(path)){
fs.mkdir(dirname)
process.exec('unrar', ['x' , path, dirname, "-o+"])
......
......@@ -188,10 +188,10 @@
"text_line_width": 0.0024
},
"Excellon2_4": {
"nf1": 2,
"nf1": 3,
"nf2": 3,
"units": "inch",
"zeroes": "trailing",
"units": "mm",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
......@@ -201,7 +201,7 @@
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
......@@ -876,7 +876,7 @@
{
"valid": function(props){
var file = props.file;
return /\.gdo$|\.pho$/ig.test(file.name)
return /\.gdo$|\.pho$|^line$|^ftdrill/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_4"
......@@ -905,8 +905,8 @@
{"orig_name" : ["osp-bottom\\.pho","solderpastebottom","past_botm"], "tl_name" : "past_botm" },
{"orig_name" : ["pleg\\.art","^ss_top","silk_top"], "tl_name" : "silk_top" },
{"orig_name" : ["sleg\\.art","^ss_bot","silk_bot"], "tl_name" : "silk_bot" },
{"orig_name" : ["soldermask-top","top-solder-mask\\.pho","soldermasktop","sm_top"], "tl_name" : "sm_top" },
{"orig_name" : ["soldermask-bottom","bottom-solder-mask\\.pho","soldermaskbottom","sm_bot"], "tl_name" : "sm_botm" },
{"orig_name" : ["soldermask1|soldermask-top","top-solder-mask\\.pho","soldermasktop","sm_top"], "tl_name" : "sm_top" },
{"orig_name" : ["soldermask2|soldermask-bottom","bottom-solder-mask\\.pho","soldermaskbottom","sm_bot"], "tl_name" : "sm_botm" },
{"orig_name" : ["top\\.pho","^top$","layertop"], "tl_name" : "top" },
{"orig_name" : ["^lay(\\d+)","layer(\\d+)\\.gdo","layer_(\\d+)"], "tl_name" : "l_($1)"},
{"orig_name" : ["^bottom\\.pho$","^bottom$","layerbottom"], "tl_name" : "bottom" },
......@@ -929,7 +929,7 @@
{orig_rule:["thruholenonplated"],drill_type:"non_plated",shape:"hole"},
{orig_rule:["thruholeplated"],drill_type:"plated",shape:"hole"},
],
profile:["enig_bot","past_top"],
profile:["top","enig_bot","past_top"],
laser : {
tl_name: "drill($1)-($2)",
regs: ["(\\d+)-(\\d+)plated\\.ncd$","(\\d+)-(\\d+)\\.drl$"]
......
料号名称
0000/222 spt smt top isl2 ... isl7 bottom smb spb rout d_top_isl2 ... d_isl7_bottom drill bot_testpoint bot_stiffener top_osp bot_osp outline top_enig bot_enig top_assem bot_assem
3333333 spt smt top isl2 ... isl7 bottom smb spb rout d_top_isl2 ... d_isl7_bottom drill ssb sst top_testpoint bot_testpoint bot_assy_mate top_assy_mate
1 spt smt top isl2 ... isl7 bottom smb spb rout d_top_isl2 ... d_isl7_bottom drill top_assem bot_assem top_testpoint bot_testpoint
top_osp bot_osp top_enig bot_enig fab_page2 bot_assy_mate top_assy_mate tmp_top_shorts tmp_bot_shorts ssb sst
i3 bottom.art top.art fab.art lay2.art ... lay9.art multipack.art
outline.art pleg.art ppst.art psm.art sleg.art spst.art ssm.art k55387-002-1-10.drl k55387-002-1-2-laser.drl ... k55387-002-1-10.rou
i6 01_topccp_ms... 02ccp_ms... ... 06_botccp_ms... as_topccp_ms... dimensionsccp_ms... outlineccp_ms... pm_topccp_ms... sm_botccp_ms... sm_topccp_ms... ss_botccp_ms... ss_topccp_ms... via_plugccp_ms... ...1-2-laser.drl ...1-6.drl
vivo:
topenig
vpn: 5sMm2U71
\ No newline at end of file
......@@ -31,4 +31,21 @@
var IKM = require('topcam.ikm6')();
var GUI = require('topsin.gengui').newGui();
var logger = require('topsin.logger');
```
\ No newline at end of file
```
A L13 17号点未知
B L1 23点如何判断 L6 28号点判断 L15 26号点判断
D L1 41 42点判断 L2
43 点判断
D L3 78点78由来
F L1 61点判断 79
77 76点判断
L5 64 72点判断
H L1 71判断
A线圈标点最后到20 21 B线圈接着到22 23 最大到28
C线圈直接从31开始 到37
D线圈从41 最大是78
E线圈51 98
This diff is collapsed.
This diff is collapsed.
......@@ -235,7 +235,6 @@ try {
selectmode:'multiple'});
if(tmplayers.length == 0){throw "cancel"}
tmplayers = tmplayers.map(function(v){return v.name})
IKM.msg(tmplayers)
// 创建拼片的辅助层
GEN.openStep({job:Job,name:Step});
......@@ -309,15 +308,15 @@ try {
// 创建辅助层,返回实际需拼片的层
var tmp_layers = tmplayers;
tmp_layers = tmp_layers.concat(sold_mask_negative)
tmplayers = tmplayers.concat(tmp_layers);
// my @tmp_layers2 = @tmplayers;
create_tmp_layer({step:Step,layer:tmplayers,matrix:matrix});
var film_scheme;
var film_scheme = {};
var index = 1;
tmplayers = tmplayers.concat(tmp_layers)
film_size.forEach(function(filmsize){
var info = get_repeat_info({step:Step,layer:tmplayers,film_size:filmsize});
if(!film_scheme[index]){film_scheme[index] = {}}
film_scheme[index].info = info;
film_scheme[index].film_count = Object.keys(info).length;
film_scheme[index].film_size = filmsize;
......@@ -336,6 +335,7 @@ try {
}
})
IKM.msg(3)
film_repeat({step:Step,layer:tmplayers,info:film_scheme[best_scheme_index].info,film_size:film_scheme[best_scheme_index].film_size});
//画profile
......@@ -350,7 +350,7 @@ try {
change_layers.forEach(function(layer){
GEN.affectedLayer({affected:'yes',mode:'single',layer:layer,clear_before:'yes'});
// GEN.selectByFilter(feat_types:'text',polarity:'positive',profile:'all');
var tmp_data = GEN.getFeature({job:Job,step:Step,layer:layer,surface:0,options:'feat_index'});
var tmp_data = GEN.getFeatures({job:Job,step:Step,layer:layer,surface:0,options:'feat_index'});
// var tmp_data = GEN.getFeatures(job:Job,step:Step,layer:layer,options:'select');
var txt_data = tmp_data.filter(function(v){return v.type=="text"})
// $GUI->debug(-text:dump(@txt_data,'---',layer,$Step,$Job));
......@@ -541,12 +541,14 @@ function _deleteLayer(layers){
})
}
function create_tmp_layer(par){
var matrix = par.matrix;
// 先清除原先存在的辅助层
GEN.deleteLayer({job:Job,layer:['~_$'],step:par.step});
GEN.deleteLayer({job:Job,layer:['~_tl_angle$'],step:par.step});
Object.keys(matrix).forEach(function(layer){
if(/_$|_tl_angle$/ig.test(layer)){
GEN.deleteLayer({job:Job,layer:[layer],step:par.step})
}
})
par.layer.forEach(function(layer){
var tmp_layer = layer+'_';
var tmp_layer_angle = layer+'_tl_angle';
......@@ -555,7 +557,7 @@ function create_tmp_layer(par){
GEN.affectedLayer({affected:'yes',layer:[tmp_layer],clear_before:'yes'});
GEN.selectByFilter({feat_types:'text',profile:'all'});
if ( GEN.getSelectCount() > 0 ){GEN.COM("sel_break")};
if( matrix[layer].tl_type == 'inner' && matrix[layer].polarity != 'negative' ){
if(matrix[layer] && matrix[layer].tl_type == 'inner' && matrix[layer].polarity != 'negative' ){
var layer_limits = GEN.getLayerLimits({job:Job,step:par.step,layer:layer,units:'inch'});
var tmp = 'pos_to_neg_tl';
GEN.createLayer({job:Job,layer:tmp,context:'board',type:'document',delete_exists:'yes'});
......@@ -598,7 +600,7 @@ function get_repeat_info(par){
var film_width = tmp_film_size[0],film_height = tmp_film_size[1];
var film_org = PAR.film_name+'-'+film_size;
var film_name=film_org,film_num=0,film_status="old";
var first_area,last_area,xstart,ystart;//第一张底片的范围/上一张底片的范围
var first_area,last_area={},xstart={},ystart;//第一张底片的范围/上一张底片的范围
par.layer.forEach(function(layer){
var tmp_layer = layer+'_';
film_status = last_area.xmin ? 'old' : 'new' ;
......@@ -631,9 +633,13 @@ function get_repeat_info(par){
// 新底片的准备工作
if( film_status == 'new' ){
film_name = film_org+'-'+film_num;
if(!info1[film_name]){info1[film_name] = {}}
if(!info1[film_name].layers){info1[film_name].layers = []}
if(!info1[film_name][layer]){info1[film_name][layer] ={shift:{}}}
info1[film_name].layers.push(layer)
info1[film_name].num = film_num;
info1[film_name].type = 'no_angle';
info1[film_name][layer].shift.x = 0;
info1[film_name][layer].shift.y = 0;
xstart.status = 1;
......@@ -654,6 +660,9 @@ function get_repeat_info(par){
//print dump($last_area->{xsize},'--',layer_limits.xsize,'--',film_width),"\n";
//print dump(@{$info{$film_name}{layers}}),"\n";
//GEN.PAUSE('tttt++'.$layer);
if(!info1[film_name]){info1[film_name] = {}}
if(!info1[film_name].layers){info1[film_name].layers = []}
if(!info1[film_name][layer]){info1[film_name][layer] ={shift:{}}}
info1[film_name].layers.push(layer);
info1[film_name][layer].shift.x = 0;
info1[film_name][layer].shift.y = last_area.ymax-layer_limits.ymin;
......@@ -671,6 +680,9 @@ function get_repeat_info(par){
}
// X方向添加
else{
if(!info1[film_name]){info1[film_name] = {}}
if(!info1[film_name].layers){info1[film_name].layers = []}
if(!info1[film_name][layer]){info1[film_name][layer] ={shift:{}}}
info1[film_name].layers.push(layer);
info1[film_name][layer].shift.x = last_area.xmax-layer_limits.xmin;
info1[film_name][layer].shift.y = xstart.status ? xstart.shifty : last_area.ymax-last_area.xmin;
......@@ -696,7 +708,7 @@ function get_repeat_info(par){
var info2 = {};
film_org = PAR.film_name+'-'+film_size;
film_name = film_org,film_num=0,film_status="old";
first_area=undefined,last_area=undefined,xstart=undefined,ystart=undefined;//第一张底片的范围/上一张底片的范围
first_area={},last_area={},xstart={},ystart={};//第一张底片的范围/上一张底片的范围
par.layer.forEach(function(layer){
var tmp_layer = layer+'_tl_angle';
film_status = last_area.xmin ? 'old' : 'new' ;
......@@ -717,7 +729,7 @@ function get_repeat_info(par){
else if( layer_limits.xsize > film_width ){
film_status = 'new' ;//if ( ($last_area->{ymax}+ layer_limits.ysize) > $film_height );
}
else if( layer_limits.ysize > $film_height ){
else if( layer_limits.ysize > film_height ){
film_status = 'new' ;//if ( ($last_area->{xmax}+ layer_limits.xsize) > film_width );
}
else{
......@@ -729,6 +741,9 @@ function get_repeat_info(par){
//新底片的准备工作
if( film_status == 'new' ){
film_name = film_org+'-'+film_num;
if(!info2[film_name]){info2[film_name] = {}}
if(!info2[film_name].layers){info2[film_name].layers = []}
if(!info2[film_name][layer]){info2[film_name][layer] ={shift:{}}}
info2[film_name].layers.push(layer)
info2[film_name].num = film_num;
info2[film_name].type = 'angle';
......@@ -752,6 +767,9 @@ function get_repeat_info(par){
//print dump($last_area->{xsize},'--',layer_limits.xsize,'--',film_width),"\n";
//print dump(@{$info{$film_name}{layers}}),"\n";
//GEN.PAUSE('tttt++'.$layer);
if(!info2[film_name]){info2[film_name] = {}}
if(!info2[film_name].layers){info2[film_name].layers = []}
if(!info2[film_name][layer]){info2[film_name][layer] ={shift:{}}}
info2[film_name].layers.push(layer);
info2[film_name][layer].shift.x = 0;
info2[film_name][layer].shift.y = last_area.ymax-layer_limits.ymin;
......@@ -769,7 +787,9 @@ function get_repeat_info(par){
}
//#X方向添加
else{
if(!info2[film_name]){info2[film_name] = {}}
if(!info2[film_name].layers){info2[film_name].layers = []}
if(!info2[film_name][layer]){info2[film_name][layer] ={shift:{}}}
info2[film_name].layers.push(layer);
info2[film_name][layer].shift.x = last_area.xmax-layer_limits.xmin;
info2[film_name][layer].shift.y = xstart.status ? xstart.shifty : last_area.ymax-last_area.xmin;
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment