From b22f98b88de2b9987fa9e48787af9acdf60be874 Mon Sep 17 00:00:00 2001
From: "scott.sun" <scott.sun@topibd.com>
Date: Tue, 13 Oct 2020 13:03:47 +0800
Subject: [PATCH] scott

---
 ats/topcam/20200929_wistarn.md               |   7 +
 ats/topcam/ATS_AIM_customer_data_analysis.js |   3 +-
 ats/topcam/ATS_AIM_data_format.js            |  19 +-
 ats/topcam/config_ats.js                     |  46 ++--
 ats/topcam/emai.js                           |   6 +-
 public_script/SEC_DRC_analysis.js            |   7 -
 public_script/scotttest.js                   | 233 +++++++++++++------
 7 files changed, 214 insertions(+), 107 deletions(-)

diff --git a/ats/topcam/20200929_wistarn.md b/ats/topcam/20200929_wistarn.md
index c656f69..bfa8e48 100644
--- a/ats/topcam/20200929_wistarn.md
+++ b/ats/topcam/20200929_wistarn.md
@@ -1,2 +1,9 @@
 ## wistarn
 
+* 100 rule更改 ok
+* 101 102 103(profile错误) 7z压缩包
+* 104 多套gerber文件
+* 106 107 113 147 无文件
+* 114 profile 直接创建失败
+* 136 139 144 多套数据
+* 141 tgz+gerber多套
\ No newline at end of file
diff --git a/ats/topcam/ATS_AIM_customer_data_analysis.js b/ats/topcam/ATS_AIM_customer_data_analysis.js
index 13562c4..732dd65 100644
--- a/ats/topcam/ATS_AIM_customer_data_analysis.js
+++ b/ats/topcam/ATS_AIM_customer_data_analysis.js
@@ -1031,9 +1031,8 @@ try {
 		})
 	});
     var err = mail.sendMail({
-        host:'cshas.ats.net',
+        host:"10.90.79.37",
         port:"25",
-        auth_method:mail.AuthMethod.LOGIN,
         connection_type:mail.ConnectionType.TCP,
         // user:'ferre.zhang@cn.ats.net',
         // password:'159482673Sun',
diff --git a/ats/topcam/ATS_AIM_data_format.js b/ats/topcam/ATS_AIM_data_format.js
index bd199ab..c5981ea 100644
--- a/ats/topcam/ATS_AIM_data_format.js
+++ b/ats/topcam/ATS_AIM_data_format.js
@@ -128,7 +128,8 @@ try {
 				}
 			}
 			if(/string/ig.test(typeof(mergeRule.drill[0]))){  // drill层 计算
-				var drill_layers = []
+				var drill_layers = [];
+				var tmp_layers = [];
 				var matrix = GEN.getMatrix({job:job})
 				// 计算最大值
 				var layers = Object.keys(matrix)
@@ -144,6 +145,7 @@ try {
 						var tmp = reg.exec(v)
 						var num1 = Number(tmp[1])
 						var num2 = Number(tmp[2])
+						tmp_layers.push({num1:num1,num2:num2,layer:v})
 						if(num1==1){
 							drill_layers.push({num1:num1,num2:num2,layer:v})
 						}
@@ -152,6 +154,10 @@ try {
 					}
 				})
 				var max = maxnum.sort(function(a,b){return b-a})[0]
+				if (drill_layers.length > 0 && String(drill_layers[0].num2) == "NaN") {
+					var maxLayer = tmp_layers.filter(function(v) {return v.num1 == max})
+					GEN.COM("matrix_rename_layer",{job:job,matrix:"matrix",layer:maxLayer[0].layer,new_name:"drill"}) 
+				}
 				var drill_layer = drill_layers.filter(function(v){return v.num2 == max})
 				if(drill_layer.length){
 					drill_layer = drill_layer[0].layer
@@ -204,7 +210,6 @@ try {
 			profileRule = mergeRule.profile
 		}
 	}
-
 	// start    martix_tl_name
 	console.log("get matrix ====== ======== job:" + job);
 	var matrix = GEN.getMatrix({job:job}); 
@@ -600,6 +605,7 @@ function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名
 }
 
 function mergeLaser(props){ // 合并钻孔
+	var tmp = []
 	if(!props.mergeRule){return}
 	var mergeRuleRegs = props.mergeRule.regs
 	var mergeTlname = props.mergeRule.tl_name
@@ -644,12 +650,18 @@ function mergeLaser(props){ // 合并钻孔
                     newdrills.push(layerName.toLowerCase())
                 }
                 GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
-                GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
+				GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
+				if(/drl|drill/ig.test(val.name) && tmp.indexOf(val.name) < 0) {
+					tmp.push(val.name)
+				}
             })
         }
 	}
 	GEN.affectedLayer({affected:"no",mode:"all"});
 	GEN.clearLayers();
+	tmp.forEach(function(layer) {
+		GEN.COM("matrix_rename_layer,job="+job+",matrix=matrix,layer="+layer+",new_name="+layer.replace(/drl|drill/, "merage"))
+	})
 	GEN.closeStep();
 	return newdrills
 }
@@ -678,6 +690,7 @@ function createOutline(props){
 	GEN.openStep({job:job, name:step})
 		GEN.affectedLayer({affected:'yes',layer:drill_layer})
 		GEN.selCopyOther({dest:'layer_name',target_layer:tmp,invert:'no',dx:0,dy:0,size:0})
+		GEN.affectedLayer({affected:'no',mode:'all'})
 	GEN.closeStep()
 
     var tmp_outline
diff --git a/ats/topcam/config_ats.js b/ats/topcam/config_ats.js
index 796b602..1309afc 100644
--- a/ats/topcam/config_ats.js
+++ b/ats/topcam/config_ats.js
@@ -190,8 +190,8 @@
 		"Excellon2_4": { 
 			"nf1": 2,
 			"nf2": 3,
-			"units": "mm",
-			"zeroes": "leading",
+			"units": "inch",
+			"zeroes": "trailing",
 			"decimal": "no",
 			"nf_comp": 0,
 			"break_sr": "yes",
@@ -201,7 +201,7 @@
 			"drill_only": "no",
 			"multiplier": 1,
 			"resolution": 3,
-			"tool_units": "mm",
+			"tool_units": "inch",
 			"coordinates": "absolute",
 			"merge_by_rule": "no",
 			"signed_coords": "no",
@@ -828,7 +828,7 @@
 				{
 					"valid": function(props){
 						var file = props.file;
-						return /.+\.ger$/ig.test(file.name) || /\.gdo$|\.bol$|\.gdo$|\.pma$|\.sma$|\.smb$|\.ssa$|\.ssb$/ig.test(file.name) ||
+						return /.+\.ger$/ig.test(file.name) || /\.pho$|\.bol$|\.gdo$|\.pma$|\.pmb$|\.spa$|\.spb$\.sma$|\.smb$|\.ssa$|\.ssb$/ig.test(file.name) ||
 						/.+\.l\d+$/ig.test(file.name)
 					},  
 					"type": "Gerber274x",		
@@ -943,25 +943,33 @@
 				}
 			],
 			"tl_name": [
-				{"orig_name" : ["^pmt\\.art$","\\.pma$","SoldPasteTop\\.ger","past_top"], "tl_name" : "past_top" },
-				{"orig_name" : ["^pmb\\.art$","\\.pmb$","SoldPasteBot\\.ger","past_botm"], "tl_name" : "past_botm" },
-				{"orig_name" : ["tsilk","^sst\\.art$","\\.ssa$","SilkScrnTop\\.ger","silk_top"], "tl_name" : "silk_top" },
-				{"orig_name" : ["bsilk","^ssb\\.art$","\\.ssb$","SilkScrnBot\\.ger","silk_bot"], "tl_name" : "silk_bot" },
-				{"orig_name" : ["tmask","^smt\\.art$","\\.sma$","SoldMask1Top\\.ger","sm_top"], "tl_name" : "sm_top" },
-				{"orig_name" : ["bmask","^smb\\.art$","\\.smb$","SoldMask1Bot\\.ger","sm_bot"], "tl_name" : "sm_botm" },
-				{"orig_name" : ["^top$","^top.art$"], "tl_name" : "top" },
-				{"orig_name" : ["^l(\\d+).*\\.art$","^v(\\d+)\\.art$","^g(\\d+)\\.art$","^s(\\d+)\\.art$","\\.l(\\d+)$","Copper(\\d+)\\.ger$","^layer_(\\d+)"], "tl_name" : "l_($1)"},
-				{"orig_name" : ["^bot\\.art$","^bottom$","^bottom.art$"], "tl_name" : "bottom" },
+				{"orig_name" : ["^pmt\\.art$","\\.pma$|\\.spa$","paste.top|soldPasteTop|pastemask.?top","past_top"], "tl_name" : "past_top" },
+				{"orig_name" : ["^pmb\\.art$","\\.pmb$|\\.spb$","paste.bot|soldPasteBot|pastemask.?bot","past_botm"], "tl_name" : "past_botm" },
+				{"orig_name" : ["tsilk","^sst\\.art$","\\.ssa$","silkscrntop|silkscreentop","silk.top|silk-top"], "tl_name" : "silk_top" },
+				{"orig_name" : ["bsilk","^ssb\\.art$","\\.ssb$","silkscrnbot|silkscreenbot","silk.bot|silk-bot"], "tl_name" : "silk_bot" },
+				{"orig_name" : ["tmask","^smt\\.art$","\\.sma$","soldmask1top|soldermask.?top","sm.top|solder.top"], "tl_name" : "sm_top" },
+				{"orig_name" : ["bmask","^smb\\.art$","\\.smb$","soldmask1bot|soldermask.?bot","sm.bot|solder.bot"], "tl_name" : "sm_botm" },
+				{"orig_name" : ["^(?:(?!assy|enig|pm|past|paste|silk|mask).)+top\\.(pho|art)$","^top$","^top\\.art$"], "tl_name" : "top" },
+				{"orig_name" : ["^(?:(?!ref).)+l(\\d)\\.art$","-(\\d+)l\\.pho$","^l(\\d+).*\\.art$","^v(\\d+)\\.art$","^g(\\d+)\\.art$","^s(\\d+)\\.art$","\\.l(\\d+)$","Copper(\\d+)\\.ger$","^layer_(\\d+)"], "tl_name" : "l_($1)"},
+				{"orig_name" : ["^(?:(?!assy|enig|pm|past|paste|silk|mask).)+bot\\.(pho|art)$","^bot\\.art$","^bottom$","^bottom.art$"], "tl_name" : "bottom" },
 				{"orig_name" : ["\\.d(\\d+)$"], "tl_name" : "d_($1)-($1+1)"},
 				{"orig_name" : ["thruHolePlated_(\\d+)_(\\d+)\\.ncd","(\\d+)-(\\d+)\\.drl$","^drill(\\d+)-(\\d+)$","^d_(\\d+)-(\\d+)$"], "tl_name" : "d_($1)-($2)"},
-				{"orig_name" : ["ThruHoleNonPlated\\.ncd$","^drill$"], "tl_name" : "drill" },
+				{"orig_name" : ["(\\d+)-(\\d+)-np\\.drl$","ThruHoleNonPlated\\.ncd$","^drill$"], "tl_name" : "drill" },
 				{"orig_name" : ["\\.rou$","^rout$"], "tl_name" : "rout" },
 				{"orig_name" : "fab.art", "tl_name" : "fab.art" },
-				{"orig_name" : ["multipack.art","^array$"], "tl_name" : "array" },
-				{"orig_name" : ["outline\\.art$","\\.bol$","PnlContourNonPlated\\.ger","^outline"], "tl_name" : "outline" },
-				{"orig_name" : ["top-enig","enig_top"], "tl_name" : "enig_top" },
-				{"orig_name" : ["bot-enig","enig_bot"], "tl_name" : "enig_bot" },
-			]
+				{"orig_name" : ["multipack\\.art","^array$"], "tl_name" : "array" },
+				{"orig_name" : ["p_outline\\.art","panel\\.art$","paneloutline\\.pho","outline\\.art$","\\.bol$","PnlContourNonPlated\\.ger","^outline"], "tl_name" : "outline" },
+				{"orig_name" : ["topside-golden","top-enig","enig_top"], "tl_name" : "enig_top" },
+				{"orig_name" : ["botside-golden","bot-enig","enig_bot"], "tl_name" : "enig_bot" },
+			],
+			"mergerule" : {
+				profile:["silk_top"],
+				drill:["(\\d+)-(\\d+)\\.drl$","\\.d(\\d+)$"],
+				laser : {
+					tl_name: "drill($1)-($2)",
+					regs: ["(\\d+)-(\\d+)\\.drl$"]
+				}
+			}
 		},
 		"Vivo":{
 			"step": "cad",
diff --git a/ats/topcam/emai.js b/ats/topcam/emai.js
index f8887ef..fa937d2 100644
--- a/ats/topcam/emai.js
+++ b/ats/topcam/emai.js
@@ -3,10 +3,10 @@ var error = require('topsin.error');
 var err = mail.sendMail({
     // host:'smtp.exmail.qq.com',
     // host:'cshas.ats.net',
-    host:"cshas.ats.net",
-    port: "25",
+    host:"10.90.79.37",
+    port:"25",
     // auth_method:mail.AuthMethod.LOGIN,
-    // connection_type:mail.ConnectionType.TCP,
+    connection_type:mail.ConnectionType.TCP,
     // user: "ferre.zhang@cn.ats.net",
     // user:'scott.sun@topibd.com',
     // password:'159482673Sun',
diff --git a/public_script/SEC_DRC_analysis.js b/public_script/SEC_DRC_analysis.js
index 37cb9ab..8d9f79f 100644
--- a/public_script/SEC_DRC_analysis.js
+++ b/public_script/SEC_DRC_analysis.js
@@ -487,13 +487,6 @@ try {
         GEN.closeStep()
     })
 
-    
-
-
-
-
-
-
 
 
 
diff --git a/public_script/scotttest.js b/public_script/scotttest.js
index 25890b4..80b77f7 100644
--- a/public_script/scotttest.js
+++ b/public_script/scotttest.js
@@ -5,9 +5,15 @@ PARAMETER:
     [
 		{
 			name : 'step',
-			title : 'step',
+			title : '操作step',
 			type : 'LineEdit',
-			property : {tool_tip : '目标step,默认是orig'},
+			property : {tool_tip : '操作step,默认是net'},
+		},
+		{
+			name : 'cutting_marign',
+			title : '切除profile外数值',
+			type : 'LineEdit',
+			property : {tool_tip : '切除profile外数值,默认是0.2mm'},
 		},
 		{
             name : 'auto_save',
@@ -24,16 +30,16 @@ PARAMETER:
 	]
 	
  VERSION_HISTORY:
-	V1.00 2020-09-01 Scott Sun
+	V1.00 2020-04-20 Scott Sun
 	    1.新版本
 		
  HELP:
  	<html><body bgcolor="#DDECFE">
 		<font size="3" color="#003DB2"><p>功能简介</p></font>
-		<p> 标题 </p>
+		<p> 删除板外 </p>
 		<br>
 		<font size="3" color="#003DB2"><p>参数配置</p></font>
-		<p> step信息 </p>
+		<p> 切除值 </p>
 		<br>
 		<font size="3" color="#003DB2"><p>注意事项</p></font>
 		<p> æ—  </p>
@@ -42,15 +48,13 @@ PARAMETER:
 */
 //////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////
-console.log("==============================>template");
+console.log("==============================>删除板外");
 // 引入模块 包
 var $ = require('topcam.scriptfunc').argv();
 var fs = require('fs');
 var _ = require('lodash');
 var mode = $.ikm ? "topcam" : "aimdfm";
 var IKM = $.ikm; 
-require("topsin.genmath")
-var genMath = new GenMath();
 if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
 var GEN = $.gen;
 var GUI = $.gui || {};
@@ -58,91 +62,174 @@ var Job = $.job || $.job_name;
 var JobId = $.job_id;
 var db = $.db || IKM.db
 var PAR = {}
-if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
+if ($.par) {
+	PAR = $.par
+} else if ($.hasOwnProperty('script_parameter')){
+	PAR = JSON.parse($.script_parameter);
+}
 if (mode === "aimdfm") {
 	var database = require("topsin.database");
 	database.addConnection($.conf.database_conf, "DFM");
 	var QDfm = database.query("DFM");
 	$.QDfm = QDfm;
 	if ($.conf.product_type == "aimdfm") {
-		QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
+		QDfm.updateRow({
+			table: "pdm_aimdfm_task",
+			data: {
+				current_process_title: $.process_title
+			},
+			where: { id: $.task_id }
+		});
 	}
 }
 var Status = 'ok';
 var resultData = [];
-var par = PAR;
-var default_par = {
-    step: "orig",
-	auto_save: "No",
-	units:"mm"
-}
-for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
-var job = Job;
+
 try {
-	if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
+	var par = PAR;
+	var default_par = {
+		step:"net",
+		cutting_marign: "0.2mm",
+		auto_save: "No",
+	}
+	for(var key in default_par){  // 设置默认属性
+		if (!par.hasOwnProperty(key) || par[key] == ""){
+			par[key] = default_par[key]
+		}
+	}
+	par.cutting_marign = parseFloat(par.cutting_marign)
+	if(!/^(([^0][0-9]+|0)\.([0-9]{1,2})$)|^([^0][0-9]+|0)$/ig.test(par.cutting_marign)){throw "cutting_marign failed"}
+	var cutting_marign_symbol = "r" + String(par.cutting_marign * 1000)
+	
+	if(_.isEmpty(Job)){throw "参数Job不存在"}
+	var job = "08ha0010hq0a0"
 	if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
 	if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
-    if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
-	var stepList = GEN.getStepList({job:job})
-	stepList = stepList.filter(function(step){
-		var reg = new RegExp(par.step,"ig")
-		return reg.test(step)
+    if(mode == "aimdfm"){
+        if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
+        GEN.checkInout({job:job,mode:"out"});
+    }
+	// 通过matrix获取board层
+	var matrix = GEN.getMatrix({job:job})
+	var board_layers = Object.keys(matrix).reduce(function(a,b){
+		if(matrix[b].context == "board"){
+			a.push(b)
+		}
+		return a
+	},[])
+	var all_layers = Object.keys(matrix)
+	var outline_layer = ["gko","gm1","ol"]
+	outline_layer = outline_layer.filter(function(v){
+		return all_layers.indexOf(v) >=0
 	})
-    stepList.forEach(function(step){
-        GEN.openStep({job:job,name:step})
-		GEN.clearLayers();  //清除层显示
-		GEN.affectedLayer({ mode: 'all', affected: 'no' });  //设置影响层全部不影响
-		GEN.COM("sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
-		GEN.units({ type: par.units }); 
-        GEN.zoomHome(); 
-
-        var feas = GEN.getFeatures({job:job,step:step,layer:"tmp",surface:1,units:"mm"})
-        IKM.msg(featsToLimits(feas))
-
-		
+	// 影响board层
+	var steplist = GEN.getStepList({job:job})
+	steplist = steplist.filter(function(v){
+		var tmpreg = new RegExp(par.step,"ig")
+		return tmpreg.test(v)
 	})
+	steplist.forEach(function(step){
+		GEN.openStep({job:job,name:step})
+		GEN.units({type:"mm"})
+		var outline_tmp = "outline_tmp"
+		// 创建outline参考层
+		if(GEN.isLayerExists({job:job,layer:outline_tmp})){
+			GEN.deleteLayer({job:job, layer:outline_tmp})
+		}
+		GEN.COM("profile_to_rout,layer="+outline_tmp+",width=1")
+		GEN.clearLayers()
+		// 切除profile以外0.2mm(cutting_marign)物件
+		board_layers.forEach(function(layer){
+			if (outline_layer.indexOf(layer)<0){
+				GEN.affectedLayer({affected:"no", mode: "all"})
+				// GEN.workLayer({name:layer,display_number:1,clear_before:'yes'});
+				// GEN.clipArea({layers_mode:'affected_layers',area:'profile',inout:'outside',margin:0,contour_cut:'no'});
+				GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
+				GEN.selectByFilter({profile:"out"})
+				// GEN.selRefFeat({layers:outline_tmp,use:'filter',mode:'include'});
+				if(GEN.getSelectCount()>0){GEN.selDelete()}
+				GEN.COM("clip_area_strt")
+				GEN.COM("clip_area_end,layers_mode=affected_layers,layer=,area=profile,area_type=rectangle,inout=outside,contour_cut=yes,margin=0,feat_types=line\;pad\;surface\;arc\;text")
 
-
+				// var outline_ref = 'ol_tl_tmp';
+				// var tmp_work_layer = '_tmp_work_layer';
+				// if(GEN.isLayerExists({job:job,layer:tmp_work_layer})){
+				// 	GEN.deleteLayer({job:job,layer:[tmp_work_layer],step:step})
+				// }
+				// if(GEN.isLayerExists({job:job,layer:outline_ref})){
+				// 	GEN.deleteLayer({job:job,layer:[outline_ref],step:step})
+				// }
+				// GEN.createLayer({job:job,layer:tmp_work_layer,conext:'misc',type:'document',delete_exists:"yes"})
+				// GEN.createLayer({job:job,layer:outline_ref,conext:'misc',type:'document',delete_exists:"yes"})
+				// GEN.workLayer({name:outline_tmp,display_number:2,clear_before:'yes'})
+				// GEN.selCopyOther({dest:'layer_name',target_layer:outline_ref,invert:'no',dx:0,dy:0,size:0})
+				// GEN.affectedLayer({affected:'yes',layer:[outline_ref],clear_before:'yes'});
+				// GEN.COM('sel_resize',{size:200,corner_ctl:'no'});
+				// GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
+				// GEN.selRefFeat({layers:outline_ref,use:'filter',mode:'cover'});
+				// if ( GEN.getSelectCount() > 0 ) {
+				// 	GEN.selCopyOther({dest:'layer_name',target_layer:tmp_work_layer,invert:'no',dx:0,dy:0,size:0});
+				// 	GEN.affectedLayer({affected:'yes',mode:'single',layer:tmp_work_layer,clear_before:'yes'});
+				// 	GEN.COM('sel_all_feat');
+				// 	GEN.selChangeSym({symbol:'r1'});
+				// 	GEN.affectedLayer({affected:'yes',mode:'single',layer:outline_ref,clear_before:'yes'});
+				// 	GEN.COM('sel_all_feat');
+				// 	GEN.selChangeSym({symbol:'r2'});
+				// 	GEN.affectedLayer({affected:'yes',mode:'single',layer:tmp_work_layer,clear_before:'yes'});
+				// 	GEN.selRefFeat({layers:outline_ref,use:'filter',mode:'cover'});
+				// 	GEN.selReverse();
+				// 	if ( GEN.getSelectCount() > 0 ){GEN.selDelete() };
+				// 	GEN.affectedLayer({affected:'yes',mode:'single',layer:layer,clear_before:'yes'});
+				// 	GEN.selRefFeat({layers:tmp_work_layer,use:'filter',mode:'include'});
+				// 	if ( GEN.getSelectCount() > 0 ){GEN.selDelete() };
+				// }
+				// GEN.deleteLayer({job:job,layer:[outline_ref,tmp_work_layer]});
+			}
+		})
+		GEN.affectedLayer({affected:'no',mode:'all'})
+		GEN.deleteLayer({job:job,layer:[outline_tmp]})
+	})
 
 	// 保存 
-	if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
-	if (mode === "aimdfm") {
-		$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
-		if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
-			return {status: Status,result_data: resultData};
-		} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
-	}else { return "Done" }
+	if(/yes/ig.test(par.auto_save)){
+		GEN.checkInout({job:job,mode:"out"})  // 结束保存料号 关闭料号
+		GEN.saveJob({ job: job });
+		GEN.checkInout({job:job,mode:"in"})
+		GEN.closeJob({job:job})
+	} else {
+		GEN.checkInout({job:job,mode:"in"})
+	}
+    if (mode === "aimdfm") {
+		$.QDfm.updateRow({
+			table: "pdm_aimdfm_task",
+			data: {
+				progress: 33.33
+			},
+			where: { id: $.task_id }
+		});
+		if (GEN.hasError()) {
+			Status = 'error';
+			resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
+			return {
+				status: Status,
+				result_data: resultData
+			};
+		} else {
+			resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
+			return {
+				status: Status,
+				result_data: resultData
+			};
+		}
+	}else {
+		return "Done"
+	}
 } catch (e) {
-	IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
+	IKM.msg(_.join(GEN.STATUS, "\n"))
+	IKM.msg(e)
+    Status = 'error';
     resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
-    return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
+	return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
 }
 
 
-
-
-function featsToLimits(feats) {
-    feats.forEach(function(item) {
-        if(item.feats) {
-            var polygon = genMath.profile2Polygon(item.feats.join("\n"),0)
-            var res = polygon.reduce(function(a,b){
-                a.xmin = b.x > a.xmin ? a.xmin : b.x;
-                a.ymin = b.y > a.ymin ? a.ymin : b.y;
-                a.xmax = b.x < a.xmax ? a.xmax : b.x;
-                a.ymax = b.y < a.ymax ? a.ymax : b.y;
-                return a
-            }, {
-                xmin: polygon[0].x,
-                ymin: polygon[0].y,
-                xmax: polygon[0].x,
-                ymax: polygon[0].y
-            })
-            res.xsize = Math.abs(res.xmax - res.xmin) 
-            res.ysize = Math.abs(res.ymax - res.ymin) 
-            res.xc = res.xmin + res.xsize/2
-			res.yc = res.ymin + res.ysize/2
-            item.limits = res
-        }
-    })
-    return feats
-}
-- 
2.21.0