From 616dcdb347ecce1fb5a2fc143d69b55d0944b6fc Mon Sep 17 00:00:00 2001
From: "scott.sun" <scott.sun@topibd.com>
Date: Wed, 9 Sep 2020 13:08:06 +0800
Subject: [PATCH] scott

---
 public_script/silkScreenOptimize.js           | 405 ++++++++++++++----
 .../sl_box_opt.pl"                            |   9 +-
 2 files changed, 332 insertions(+), 82 deletions(-)
 rename "public_script/\345\255\227\347\254\246\344\274\230\345\214\226/\345\255\227\346\241\206\345\210\206\347\246\273.pl" => "public_script/\345\255\227\347\254\246\344\274\230\345\214\226/sl_box_opt.pl" (98%)

diff --git a/public_script/silkScreenOptimize.js b/public_script/silkScreenOptimize.js
index dc91d4c..c375ce4 100644
--- a/public_script/silkScreenOptimize.js
+++ b/public_script/silkScreenOptimize.js
@@ -147,13 +147,14 @@ var resultData = [];
 var par = PAR;
 var default_par = {
 	units:"mm",
-	cover_layer_suffix: "_cover",
 	ss_to_sm: 10,		// 文字距离阻焊
 	ss_to_smd: 10,		// 文字距离SMD
 	ss_to_bga: 10,		// 文字距离bga
 	text_height: 1,   // 文字最大高度
 	bk_suffix: "_bk",  // 备份层后缀
 	silk_suffix: "_font", // 分离的文字层后缀
+	cover_layer_suffix: "_cover",
+	tol: 1,
 	select_lyr: "no",
     step: "unit",
 	auto_save: "No",
@@ -173,15 +174,17 @@ try {
     if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
 
 
-    var err = createCoverLayer()  // 创建套层
-	if (err) {throw err}
-
-	var err = ssFrameSeparate() // 分离文字和文字框
-	if (err) {throw err}
-
+    // var err = createCoverLayer()  // 创建套层
+	// if (err) {throw err}
 
+	// var err = ssFrameSeparate() // 分离文字和文字框
+	// if (err) {throw err}
 
+	var err = slBoxOptimize() // 文字框优化
+	if (err) {throw err}
 
+	// var err = slOptimize() // 文字优化
+	// if (err) {throw err}
 
 
 
@@ -314,7 +317,6 @@ function createCoverLayer (props){
 	GEN.affectedLayer({affected:'no',mode:'all'})
 	GEN.clearLayers()
 }
-
 // 字符 和 文字框分开
 function ssFrameSeparate () {
 	// 1. step过滤
@@ -446,7 +448,6 @@ function ssFrameSeparate () {
 						if ( GEN.getSelectCount() > 0 ){
 							GEN.createLayer({job:job,layer:cover_lyr_2,delete_exists:'yes'});
 							GEN.selCopyOther({target_layer:cover_lyr_2,invert:'no'});
-
 						}
 						GEN.affectedLayer({affected:'yes',layer:[ss_line_arc],clear_before:'yes'});
 						GEN.selContourize();
@@ -518,86 +519,300 @@ function ssFrameSeparate () {
 			})
 		}
 		GEN.COM("disp_on")
+		var ref_layers = work_layers.filter(function(layer){ return GEN.isLayerExists({job:job, layer:layer + par.silk_suffix}) }).map(function(layer){
+			return {
+				work_layer: layer,
+				ref_layer: layer + par.silk_suffix
+			}
+		})
+		if(ref_layers.length > 0) {
+			ref_layers.forEach(function(layerInfo){
+				GEN.affectedLayer({affected:'no',mode:'all'})
+				GEN.clearLayers()
+				var work_layer = layerInfo.work_layer;
+				var ref_layer = layerInfo.ref_layer;
+				IKM.msg(work_layer+"层字框分离");
+				GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
+				if(correct(work_layer)){ var tmp = work_layer; work_layer = ref_layer,ref_layer = tmp; }
+				GEN.displayLayer({name:ref_layer,number:2});
+				var flag = true;
+				IKM.msg("请选择需移动的文字或者的文字框,不需制作了请【左键框选空白处】")
+				while(flag){
+					var tmp_con = GEN.MOUSE({type:'r',text:"Please Select"});
+					GEN.COM("filter_area_strt")
+					GEN.COM("filter_area_xy,x="+tmp_con.x1+",y="+tmp_con.y1)
+					GEN.COM("filter_area_xy,x="+tmp_con.x2+",y="+tmp_con.y2)
+					GEN.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=no")
+					if(GEN.getSelectCount() > 0){
+						if(correct(work_layer)){ var tmp = work_layer; work_layer = ref_layer,ref_layer = tmp; }
+						GEN.selSubstitute({tol:1,mode:'select'});
+						GEN.selMoveOther({target_layer:ref_layer,invert:'no'});
+					} else {
+						flag = false;
+					}
+				}
+			})
+		}
+	})
+}
+// 文字框按阻焊扩大
+function slBoxOptimize(){
+	// 1. step过滤
+	var workstep = getWorkStep()
+	if(!Array.isArray(workstep)){throw "工作step错误"}
+	// 2.过滤工作层
+	var work_layers = getLayer({layer_type:"silk_screen", context: "board"})
+	if(/yes/ig.test(par.select_lyr)){
+		var matrix = GEN.getMatrix({job:job});
+		var layers = Object.keys(matrix).map(function(key){
+			var tmp  ={};
+			tmp[key] = key;
+			return tmp
+		})
+		work_layers = gui.selectMultiple({title: "请先择工作层",list: layers,defaultvalue: work_layers,columns: 4,gen: GEN})	
+	}
+	if(work_layers.length == 0 ) {return "没有先择layer"}
 
-		var ref_layers = work_layers.filter(function(layer){ return GEN.isLayerExists({job:job, layer:layer + par.silk_suffix}) })
-		// if(ref_layers.length > 0) {
-		// 	GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
-		// 	while (1) {
-		// 		LOOP:
-		// 		GEN.COM('disp_on');
-	
-		// 		while(1){
-		// 			work_layer = GEN.getWorkLayer();
-		// 			last  if (grep($_ eq work_layer ,@work_layers) or grep($_.$PAR->{silk_suffix} eq work_layer ,@work_layers));
-		// 			update_loading("请选择一个文字层或者文字框层设为工作层",0,position:'n');
-		// 			my $ans = GEN.PAUSE('Please Set Work Layer');
-		// 			return 'Cancel' unless $ans eq 'OK';
-		// 		}
-				
-		// 		// 给出默认移动层
-		// 		if (grep($_ eq work_layer ,@work_layers)) {
-		// 		   ref_layer = work_layer.$PAR->{silk_suffix};
-		// 		}else if(grep($_.$PAR->{silk_suffix} eq work_layer ,@work_layers)){
-		// 			ref_layer = work_layer;
-		// 			ref_layer =~ s/\Q$PAR->{silk_suffix}\E$//;
-		// 		}
-				
-		// 		if (! GEN.isLayerExists({job:job,layer:ref_layer}) ){
-		// 			IKM.msg("没有找到对应层"+ref_layer+" ,请重新选择工作层!")
-		// 			goto LOOP;
-		// 		}
-		// 		GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
-		// 		GEN.displayLayer({name:ref_layer,number:2});
-	
-		// 		update_loading("请选择需移动的文字或者的文字框,不需制作了请【左键框选空白处】",0,position:'n');
-		// 		var tmp_con = GEN.MOUSE({type:'r',text:"Please Select"});
-		// 		work_layer = GEN.getWorkLayer();
-		// 		GEN.COM('disp_off');
-	
-		// 		// 允许人员手动换工作层,重新判断移动层
-		// 		if (grep($_ eq work_layer ,@work_layers)) {
-		// 		   ref_layer = work_layer.$PAR->{silk_suffix};
-		// 		}else if(grep($_.$PAR->{silk_suffix} eq work_layer ,@work_layers)){
-		// 			ref_layer = work_layer;
-		// 			ref_layer =~ s/\Q$PAR->{silk_suffix}\E$//;
-		// 		}
-		// 		if (! GEN.isLayerExists({job:job,layer:ref_layer}) ){
-		// 			IKM.msg("没有找到对应层"+ref_layer+" ,请重新选择工作层!")
-		// 			goto LOOP;
-		// 		}
-		// 		// GEN.workLayer(name:work_layer,display_number:1,clear_before:'yes');
-		// 		GEN.displayLayer({name:ref_layer,number:2});
-				
-		// 		if ( GEN.getSelectCount() > 0 ){
-		// 			GEN.selSubstitute({tol:1,mode:'select'});
-		// 			GEN.selMoveOther({target_layer:ref_layer,invert:'no'});
-		// 		}else{
-		// 			GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
-		// 			GEN.selectByFilter({area_rect:tmp_con});
-					
-		// 			if ( GEN.getSelectCount() > 0 ){
-		// 				GEN.selSubstitute({tol:1,mode:'select'});
-		// 				GEN.selMoveOther({target_layer:ref_layer,invert:'no'});
-		// 			}
-		// 			else{
-		// 				GEN.COM('disp_on');
-		// 				last;
-		// 			}
-		// 		}
-		// 	}
-		// } else {
-		// 	IKM.msg("没有找到文字框和对应的文字层,程序将退出。")
-		// }
+	var matrix = GEN.getMatrix({job:job})
+	workstep.forEach(function(step){
+		var units = par.units;
+		GEN.openStep({job:job,name:step});
+		GEN.units({ type:units });
+		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.zoomHome();
+		var ref_layers = work_layers.filter(function(layer){ return GEN.isLayerExists({job:job, layer:layer + par.cover_layer_suffix}) }).map(function(layer){
+			return {
+				work_layer: layer,
+				ref_layer: layer + par.cover_layer_suffix
+			}
+		})
+		if(ref_layers.length > 0) {
+			ref_layers.forEach(function(layerInfo){ // {"work_layer":"gto","ref_layer":"gto_cover"}
+				GEN.affectedLayer({affected:'no',mode:'all'})
+				GEN.clearLayers()
+				var work_layer = layerInfo.work_layer;
+				var ref_layer = layerInfo.ref_layer;
+				var tmp1 = 'tl_script_tmp1', tmp2 = "tl_script_tmp2";
+				delLayer([tmp1, tmp2]);
+				GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
+				GEN.displayLayer({name:ref_layer,number:2});
+				// 放大
+				var ref_pad = "tmp_ref_pad"; delLayer([ref_pad]);
+				GEN.createLayer({job:job,layer:ref_pad,context:'misc',type:'document'});
+
+				var flag = true;
+				IKM.msg("请选择需放大的文字框,不需制作了请【左键框选空白处】")
+				while(flag){
+					var tmp_con = GEN.MOUSE({type:'r',text:"Please Select"});
+					GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
+					GEN.COM("filter_area_strt")
+					GEN.COM("filter_area_xy,x="+tmp_con.x1+",y="+tmp_con.y1)
+					GEN.COM("filter_area_xy,x="+tmp_con.x2+",y="+tmp_con.y2)
+					GEN.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=no")
+					if(GEN.getSelectCount() > 0){
+						selCopyOther({layer: tmp1})
+						// 判断特殊倾斜情况
+						var layer_feature = GEN.getFeatures({job:job,step:step,layer:tmp1})
+						// [{"type":"line","xs":"2.6998077","ys":"3.321854","xe":"2.6998077","ye":"3.4104367","symbol":"r7","polarity":"positive","attributes":[]},{"type":"line","xs":"2.6998077","ys":"3.321854","xe":"2.8912643","ye":"3.321854","symbol":"r7","polarity":"positive","attributes":[]},{"type":"line","xs":"2.6998077","ys":"3.4104367","xe":"2.8912643","ye":"3.4104367","symbol":"r7","polarity":"positive","attributes":[]},{"type":"line","xs":"2.8912643","ys":"3.321854","xe":"2.8912643","ye":"3.4104367","symbol":"r7","polarity":"positive","attributes":[]}]
+						// 1.算出最长边的角度
+						var angle = getAngle(layer_feature)
+						if (angle %90 == 0) {angle = 0}
+						if (angle < 0){angle = 90 + angle}
+						// 求中心点
+						GEN.workLayer({name:ref_layer,display_number:1,clear_before:'yes'});
+						var layer_limits_tmp1 = GEN.getLayerLimits({job:job,step:step,layer:tmp1,units:units});
+						GEN.selectByFilter({area_rect:{x1:layer_limits_tmp1.xmin-0.01,y1:layer_limits_tmp1.ymin-0.01,x2:layer_limits_tmp1.xmax+0.01,y2:layer_limits_tmp1.ymax+0.01}});
+						selCopyOther({layer: "tmp_center"})
+						var layer_limits_tmp = GEN.getLayerLimits({job:job,step:step,layer:"tmp_center",units:units});
+						layer_limits_tmp.xc = layer_limits_tmp.xmin - 0 + layer_limits_tmp.xsize/2;
+						layer_limits_tmp.yc = layer_limits_tmp.ymin - 0 + layer_limits_tmp.ysize/2;
+						delLayer("tmp_center")
+						GEN.clearLayers()
+						GEN.affectedLayer({affected:'no',mode:'all'})
+						GEN.affectedLayer({affected:'yes',layer:[work_layer,tmp1]})
+						GEN.COM("filter_area_strt")
+						GEN.COM("filter_area_xy,x="+tmp_con.x1+",y="+tmp_con.y1)
+						GEN.COM("filter_area_xy,x="+tmp_con.x2+",y="+tmp_con.y2)
+						GEN.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=no")
+						// 更具角度将其旋转
+						GEN.selTransform({mode:'anchor',oper:"rotate",x_anchor:layer_limits_tmp.xc,y_anchor:layer_limits_tmp.yc,angle:angle})
+						GEN.affectedLayer({affected:'no',mode:'all'})
+						GEN.workLayer({name:ref_layer,display_number:1,clear_before:'yes'});
+						GEN.selectByFilter({area_rect:{x1:layer_limits_tmp1.xmin-0.01,y1:layer_limits_tmp1.ymin-0.01,x2:layer_limits_tmp1.xmax+0.01,y2:layer_limits_tmp1.ymax+0.01}});
+						GEN.selTransform({mode:'anchor',oper:"rotate",x_anchor:layer_limits_tmp.xc,y_anchor:layer_limits_tmp.yc,angle:angle})
+
+						GEN.copyLayer({source_job:job,source_step:step,source_layer:tmp1,dest_layer:tmp2,mode:'replace',invert:'no'});
+						var text_tmp = 'tl_tmp_text';
+						GEN.copyLayer({source_job:job,source_step:step,source_layer:tmp1,dest_layer:text_tmp,mode:'replace',invert:'no'});
+						var layer_limits = GEN.getLayerLimits({job:job,step:step,layer:text_tmp,units:units});
+						layer_limits.xc = layer_limits.xmin - 0 + layer_limits.xsize/2;
+						layer_limits.yc = layer_limits.ymin - 0 + layer_limits.ysize/2;
+						var scalex=1,scaley=1;
+						GEN.affectedLayer({affected:'yes',layer:[ref_layer],clear_before:'yes'});
+						GEN.selectByFilter({area_rect:{x1:layer_limits.xmin-0.01,y1:layer_limits.ymin-0.01,x2:layer_limits.xmax+0.01,y2:layer_limits.ymax+0.01}});
+						if ( GEN.getSelectCount() > 0 ){
+							GEN.selCopyOther({target_layer:ref_pad,invert:'no'});
+							var layer_limits_pad = GEN.getLayerLimits({job:job,step:step,layer:ref_pad,units:units});
+							var feature = GEN.getFeatures({job:job,step:step,layer:tmp1,units:units});
+							var line_width = feature[0].symbol.slice(1) / 1000;
+							var tmp_ps = 0.004;
+							if (units == "mm"){tmp_ps = tmp_ps*25.4}
+// {"layer_limits_pad":{"xmin":"68.6901125","ymin":"84.4900925","xmax":"73.310115","ymax":"86.5100925",
+// "xsize":4.620002499999998,"ysize":2.019999999999996},"line_width":0.1778,
+// "layer_limits":{"xmin":"68.486215","ymin":"84.2861925","xmax":"73.527","ymax":"86.714",
+// "xsize":5.040785,"ysize":2.4278075,"xc":71.0066075,"yc":85.50009625}}
+							scalex = (Number(layer_limits_pad.xsize)+line_width*2+tmp_ps)/(layer_limits.xsize);
+							if(scalex < 1) {scalex = 1 }
+							scaley = (Number(layer_limits_pad.ysize)+line_width*2+tmp_ps)/(layer_limits.ysize);
+							if(scaley < 1) {scaley = 1 }
+						}
+						delLayer(text_tmp)
+						GEN.affectedLayer({affected:'yes',layer:[tmp1],clear_before:'yes'});
+						GEN.selTransform({mode:'anchor',oper:'scale',x_anchor:layer_limits_tmp.xc,y_anchor:layer_limits_tmp.yc,x_scale:scalex,y_scale:scaley}) 
+						// {"mode":"anchor","oper":"scale","x_anchor":71.0066075,"y_anchor":85.50009625,"x_scale":1,"y_scale":1}
+						// 检查是否含单根线
+						var tmp = 'tl-'+tmp1+'tmp1++';
+						var _tmp2 = 'tl-'+tmp1+'tmp2++';
+						var tmp3 = 'tl-'+tmp1+'-alone';
+						var cale_x = scalex;  // ?
+						var cale_y = scaley;  // ?
+						GEN.createLayer({job:job,layer:tmp,context:'misc',type:'document',delete_exists:'yes'});
+						GEN.createLayer({job:job,layer:tmp3,context:'misc',type:'document',delete_exists:'yes'});
+
+						GEN.selCopyOther({target_layer:tmp,invert:'no'});
+						GEN.affectedLayer({affected:'yes',mode:'single',layer:tmp,clear_before:'yes'});
+						GEN.selContourize();
+
+						GEN.DO_INFO("-t layer -e "+job+"/"+step+"/"+tmp+" -d FEAT_HIST");
+						
+						if (GEN.INFO_RESULT.gFEAT_HISTsurf > 0) {
+							for(var i=1;i <= GEN.INFO_RESULT.gFEAT_HISTsurf;i++){
+								GEN.createLayer({job:job,layer:_tmp2,context:'misc',type:'document',delete_exists:'yes'});
+								GEN.affectedLayer({affected:'yes',mode:'single',layer:tmp,clear_before:'yes'});
+								GEN.COM('sel_layer_feat',{operation:'select',layer:tmp,index:i});
+								GEN.selCopyOther({target_layer:_tmp2,invert:'no'});
+								GEN.affectedLayer({affected:'yes',mode:'single',layer:_tmp2,clear_before:'yes'});
+								GEN.COM('sel_surf2outline',{width:1});
+								GEN.COM('filter_reset',{filter_name:'popup'});
+								GEN.selectByFilter({feat_types:'arc',polarity:'positive',profile:'all'});
+								if (GEN.getSelectCount() > 0) {GEN.selDelete() } ;
+								var feat = GEN.getFeatures({job:job,step:step,layer:_tmp2});
+								var hash = {};
+								for(var i=0;i < feat;i++){
+									for(var k = i+1;k < feat; k++){
+										if ((feat[i].xs == feat[k].xs && feat[i].ys == feat[k].ys) ||
+											(feat[i].xs == feat[k].xe && feat[i].ys == feat[k].ye) ){
+												if(!hash[i+'star']){hash[i+'star'] = {}}
+												hash[i+'star'][x] = feat[i].xs;
+												hash[i+'star'][y] = feat[i].ys;
+										}
+										if ((feat[i].xe == feat[k].xs && feat[i].ye == feat[k].ys) ||
+											(feat[i].xe == feat[k].xe && feat[i].ye == feat[k].ye)) {
+												if(!hash[i+'end']){hash[i+'end'] = {}}
+												hash[i+'end'][x] = feat[i].xe;
+												hash[i+'end'][y] = feat[i].ye;
+										}
+									}
+								}
+								if (Object.keys(hash).length == 0) {
+									GEN.affectedLayer({affected:'yes',mode:'single',layer:tmp1,clear_before:'yes'});
+									GEN.selRefFeat({layers:_tmp2,use:'filter',mode:'touch'});
+									if ( GEN.getSelectCount() > 0 ){
+										GEN.COM('sel_move_other',{target_layer:tmp3,invert:'no',dx:0,dy:0,size:0,x_anchor:0,y_anchor:0,rotation:0,mirror:'none'});
+										var change_scal_x = (1 / cale_x).toFixed(3) - 0;
+										var change_scal_y = (1 / cale_y).toFixed(3) - 0;
+										GEN.affectedLayer({affected:'yes',mode:'single',layer:tmp3,clear_before:'yes'});
+										GEN.selTransform({mode:'axis',oper:'scale',x_anchor:0,y_anchor:0,x_scale:change_scal_x,y_scale:change_scal_y});
+										// {"mode":"axis","oper":"scale","x_anchor":0,"y_anchor":0,"x_scale":1,"y_scale":1}
+										GEN.COM('sel_move_other',{target_layer:tmp1,invert:'no',dx:0,dy:0,size:0,x_anchor:0,y_anchor:0,rotation:0,mirror:'none'});
+										GEN.deleteLayer({job:job,layer:tmp3,step:step});
+									}
+								}
+							}
+							GEN.deleteLayer({job:job,layer:_tmp2,step:step});
+							GEN.deleteLayer({job:job,layer:tmp,step:step});
+						}else{
+							GEN.deleteLayer({job:job,layer:tmp,step:step});
+							if (GEN.isLayerEmpty({job:job,step:step,layer:tmp3})) {
+							GEN.deleteLayer({job:job,layer:tmp3,step:step});
+							}
+						}
+
+
+						// 转回去
+						GEN.clearLayers()
+						GEN.affectedLayer({affected:'yes',layer:[work_layer,tmp1,tmp2], clear_before:"yes"})
+						GEN.COM("filter_area_strt")
+						GEN.COM("filter_area_xy,x="+tmp_con.x1+",y="+tmp_con.y1)
+						GEN.COM("filter_area_xy,x="+tmp_con.x2+",y="+tmp_con.y2)
+						GEN.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=no")
+						GEN.selTransform({mode:'anchor',oper:"rotate",x_anchor:layer_limits_tmp.xc,y_anchor:layer_limits_tmp.yc,angle:360-angle})
+						GEN.affectedLayer({affected:'no',mode:'all'})
+						GEN.workLayer({name:ref_layer,display_number:1,clear_before:'yes'});
+						if(GEN.isLayerExists({ job:job,step:step,layer:ref_pad})){GEN.affectedLayer({affected:'yes',layer:ref_pad})}
+						GEN.selectByFilter({area_rect:{x1:layer_limits_tmp1.xmin-0.01,y1:layer_limits_tmp1.ymin-0.01,x2:layer_limits_tmp1.xmax+0.01,y2:layer_limits_tmp1.ymax+0.01}});
+						GEN.selTransform({mode:'anchor',oper:"rotate",x_anchor:layer_limits_tmp.xc,y_anchor:layer_limits_tmp.yc,angle:360-angle})
+
+						GEN.workLayer({name:tmp1,display_number:1,clear_before:'yes'});
+						GEN.displayLayer({name:work_layer,number:2});
+						if(!GEN.isLayerEmpty({ job:job,step:step,layer:ref_pad})){GEN.displayLayer({name:ref_layer,number:3})}
+						GEN.COM('disp_on');
+						var ans = GEN.PAUSE('Please Check...');
+						if(!/ok/ig.test(ans)){ throw "cancel" }
+						GEN.COM('disp_off');
 
+
+						var tmp_symbol = 'tl_script_tmp';
+						GEN.COM('sel_all_feat');
+						GEN.COM( "sel_create_sym,symbol="+tmp_symbol+",x_datum=0,y_datum=0,delete=no,fill_dx=0.1,fill_dy=0.1,attach_atr=no,retain_atr=no" );
+						GEN.workLayer({name:work_layer,display_number:1,clear_before:'yes'});
+						GEN.selRefFeat({layers:tmp2,use:'filter',mode:'cover'});
+						GEN.COM( "sel_substitute,mode=substitute,symbol="+tmp_symbol+",tol="+par.tol+",x_datum=0,y_datum=0,dcode=0" );
+						GEN.selectByFilter({include_syms:tmp_symbol});
+						if ( GEN.getSelectCount() > 0 ){GEN.selBreak()};
+						GEN.COM('disp_on');
+						GEN.COM('truncate_layer', {layer :tmp1});
+						GEN.COM('truncate_layer', {layer :tmp2});
+						GEN.COM('disp_on');
+						GEN.COM('sel_clear_feat');
+						GEN.units({type:units});
+					} else {
+						flag = false;
+					}
+				}
+			})
+		}
 	})
+
+
 }
 
+// 文字放大
+function slOptimize() {
+	// 1. step过滤
+	var workstep = getWorkStep()
+	if(!Array.isArray(workstep)){throw "工作step错误"}
+	// 2.过滤工作层
+	var work_layers = getLayer({layer_type:"silk_screen", context: "board"})
+	if(/yes/ig.test(par.select_lyr)){
+		var matrix = GEN.getMatrix({job:job});
+		var layers = Object.keys(matrix).map(function(key){
+			var tmp  ={};
+			tmp[key] = key;
+			return tmp
+		})
+		work_layers = gui.selectMultiple({title: "请先择工作层",list: layers,defaultvalue: work_layers,columns: 4,gen: GEN})	
+	}
+	if(work_layers.length == 0 ) {return "没有先择layer"}
 
+	var matrix = GEN.getMatrix({job:job})
 
+	IKM.msg(work_layers)
+
+
+}	
 
-// 文字框按阻焊扩大
 
-// 文字放大
 
 
 function selCopyOther(props){ // {layer , invent,  dx, dy , size}
@@ -758,6 +973,34 @@ function delLayer(layer){
 	}
 	layer = layer.filter(function(v){return GEN.isLayerExists({job:job, layer:v})})
 	if(layer.length){
-		GEN.deleteLayer({job:job, layer:[layer]})
+		GEN.deleteLayer({job:job, layer:layer})
 	}
+}
+
+function correct(work_layer){
+	var tmp = GEN.getWorkLayer();
+	return tmp !== work_layer;
+}
+
+function getAngle(features){ // 获取最长边的角度
+	features.sort(function(a,b){
+		a.length = getLineLength(a);
+		b.length = getLineLength(b);
+		return a.length - b.length
+	})
+	return getRodate(features[features.length - 1])
+}
+function getLineLength (line){
+    if (line.type != "line"){return 0}
+    return Math.sqrt((line.xe - line.xs)*(line.xe - line.xs) + (line.ye - line.ys)*(line.ye - line.ys)) 
+}
+function getRodate(props){
+    var xs = props.xs;
+    var ys = props.ys;
+    var xe = props.xe;
+    var ye = props.ye;
+    var y = ye - ys;
+    var x = xe - xs;
+    var r = Math.atan(y / x)
+    return r*180/Math.PI
 }
\ No newline at end of file
diff --git "a/public_script/\345\255\227\347\254\246\344\274\230\345\214\226/\345\255\227\346\241\206\345\210\206\347\246\273.pl" "b/public_script/\345\255\227\347\254\246\344\274\230\345\214\226/sl_box_opt.pl"
similarity index 98%
rename from "public_script/\345\255\227\347\254\246\344\274\230\345\214\226/\345\255\227\346\241\206\345\210\206\347\246\273.pl"
rename to "public_script/\345\255\227\347\254\246\344\274\230\345\214\226/sl_box_opt.pl"
index 533a456..1d4ec45 100644
--- "a/public_script/\345\255\227\347\254\246\344\274\230\345\214\226/\345\255\227\346\241\206\345\210\206\347\246\273.pl"
+++ "b/public_script/\345\255\227\347\254\246\344\274\230\345\214\226/sl_box_opt.pl"
@@ -368,12 +368,19 @@ sub enlarge_slik_frame{
 			$scalex = 1 if $scalex < 1;
 			$scaley = ($layer_limits_pad->{ysize}+$line_width*2+0.004)/($layer_limits->{ysize});
 			$scaley = 1 if $scaley < 1;
-			#$GUI->debug(dump($scalex,'====',$scaley));
+			$GUI->debug(dump($layer_limits_pad));
+			$GUI->debug(dump($line_width));
+			$GUI->debug(dump($layer_limits));
+			# layer_limits_pad : {xmax:"2.886225",xmin:"2.7043351",xsize:"0.1818899",ymax:"3.4059092",ymin:"3.3263816",ysize:"0.0795276"}
+			# line_width : 0.007
+			# layer_limits : {xc:"2.795536",xmax:"2.8947643",xmin:"2.6963077",xsize:"0.1984566",yc:"3.36614535",ymax:"3.4139367",ymin:"3.318354",ysize:"0.0955826999999996"}
+			# (scalex:"1.00722223397962", "====", scaley:"1.02034782444941")
 		}
 		#else{
 		#	next;
 		#}
 
+
 		##
 		$GEN->deleteLayer(job=>$Job,layer=>[$text_tmp]);
 		
-- 
2.21.0