Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
Scott
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Scott Sun
Scott
Commits
f4212ebf
Commit
f4212ebf
authored
Sep 04, 2020
by
Scott Sun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
s
parent
046d9396
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
3231 additions
and
13 deletions
+3231
-13
gui_test.js
GUI测试/gui_test.js
+247
-0
silkScreenOptimize.js
public_script/silkScreenOptimize.js
+659
-13
TL_text_optimization.pl
public_script/字符优化/TL_text_optimization.pl
+763
-0
sl_separate.pl
public_script/字符优化/sl_separate.pl
+576
-0
创建套层.pl
public_script/字符优化/创建套层.pl
+347
-0
字框分离.pl
public_script/字符优化/字框分离.pl
+639
-0
No files found.
GUI测试/gui_test.js
0 → 100644
View file @
f4212ebf
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name:"step",
title:"step名称",
type:"LineEdit",
property:{tool_tip:"step名称,默认orig"}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-06-10 Scott Sun
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>
<p> 配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>li bei xiao yin start"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
mode
=
$
.
ikm
?
"topcam"
:
"aimdfm"
;
var
IKM
=
$
.
ikm
;
if
(
IKM
==
undefined
)
{
IKM
=
require
(
'topcam.ikm6'
)(
$
)
}
var
GEN
=
$
.
gen
;
var
GUI
=
$
.
gui
||
{};
var
Job
=
$
.
job
||
$
.
job_name
;
Job
=
Job
.
toLowerCase
()
var
job
=
Job
var
JobId
=
$
.
job_id
;
var
db
=
$
.
db
||
{}
var
PAR
=
{}
if
(
$
.
par
)
{
PAR
=
$
.
par
}
else
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
var
par
=
PAR
;
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
}
});
}
}
var
Status
=
'ok'
;
var
resultData
=
[];
var
debug
=
true
;
var
default_par
=
{
// par默认参数?
step
:
"orig"
,
auto_save
:
"no"
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
function
NewGUI
(
gui
)
{
this
.
msgBox
=
function
(
props
){
// title type content button
props
=
props
||
{}
return
gui
.
msgBox
(
props
.
title
||
"title"
,
props
.
type
||
"info"
,
props
.
content
||
"content"
,
props
.
button
||
[
"ok"
,
"cancel"
]);
}
this
.
selectFromTreeview
=
gui
.
selectFromTreeview
this
.
confirm
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
confirm
(
props
.
content
||
"content"
,
props
.
button
||
[
"yes"
,
"no"
],
props
.
type
||
"question"
);
}
this
.
selectFile
=
function
(
props
){
// "choose something", "*", true, "file", "/home/abby/fast_io"
props
=
props
||
{}
return
gui
.
selectFile
(
props
.
title
||
"choose something"
,
props
.
filter
||
"*"
,
props
.
multiple
||
false
,
"file"
,
""
);
}
this
.
selectSingle
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
selectSingle
({
"title"
:
props
.
title
||
"select"
,
"list"
:
props
.
list
||
[],
"default"
:
props
[
"default"
]
||
""
,
"columns"
:
props
.
columns
||
2
,
"gen"
:
props
.
gen
||
GEN
});
}
this
.
selectMultiple
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
selectMultiple
({
"title"
:
props
.
title
||
"select"
,
"list"
:
props
.
list
||
[],
"defaultvalue"
:
props
[
"default"
]
||
[
""
],
"columns"
:
props
.
columns
||
2
,
"gen"
:
props
.
gen
||
GEN
});
}
this
.
selectFromTable
=
gui
.
selectFromTable
this
.
snapScreen
=
gui
.
snapScreen
this
.
imageViewer
=
gui
.
imageViewer
this
.
inputBox
=
gui
.
inputBox
this
.
showForm
=
gui
.
showForm
this
.
selectLayer
=
function
(
props
){
props
=
props
||
{}
return
gui
.
selectLayer
({
title
:
props
.
title
||
"请选择层"
,
filter
:
props
.
filter
||
".*"
,
// regular expression
selectmode
:
props
.
selectmode
||
"multiple"
,
// single, multiple
context
:
props
.
context
||
"all"
,
// all, board, misc
layertype
:
props
.
layertype
||
"signal"
,
// default type of layertypelist
defaultsize
:
props
.
defaultsize
||
[
600
,
400
],
// window size
layermatrix
:
props
.
layermatrix
||
props
.
matrix
,
layertypelist
:
props
.
layertypelist
||
[
{
name
:
"all"
,
display_name
:
"all"
,
filter
:
function
(
x
)
{
return
x
}},
{
name
:
"signal"
,
display_name
:
"signal"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"signal"
;
}},
{
name
:
"power_ground"
,
display_name
:
"power_ground"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"power_ground"
;
}},
{
name
:
"mixed"
,
display_name
:
"mixed"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"mixed"
;
}},
{
name
:
"solder_mask"
,
display_name
:
"solder_mask"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_mask"
;
}},
{
name
:
"silk_screen"
,
display_name
:
"silk_screen"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"silk_screen"
;
}},
{
name
:
"solder_paste"
,
display_name
:
"solder_paste"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_paste"
;
}},
{
name
:
"drill"
,
display_name
:
"drill"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"drill"
;
}},
{
name
:
"rout"
,
display_name
:
"rout"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"rout"
;
}},
{
name
:
"document"
,
display_name
:
"document"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"document"
;
}}
],
gen
:
props
.
GEN
||
GEN
})
}
this
.
lockUnlockLayer
=
function
(
props
){
props
=
props
||
{}
var
tmp
=
{}
if
(
props
.
matrix
)
{
for
(
var
key
in
props
.
matrix
)
{
var
item
=
props
.
matrix
[
key
]
tmp
[
key
]
=
{
row
:
item
.
row
,
name
:
item
.
name
}
}
}
return
gui
.
lockUnlockLayer
({
title
:
props
.
title
||
"lockUnlockLayer"
,
layermatrix
:
props
.
layermatrix
||
tmp
})
}
this
.
passwordBox
=
function
(
props
){
props
=
props
||
{}
return
gui
.
passwordBox
({
title
:
props
.
title
||
"password"
,
password
:
props
.
password
||
"1212"
})
}
this
.
selectJobLayer
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
selectJobLayer
({
layertypelist
:
props
.
layertypelist
||
[
{
name
:
"all"
,
display_name
:
"all"
,
filter
:
function
(
x
)
{
return
x
}},
{
name
:
"signal"
,
display_name
:
"signal"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"signal"
;
}},
{
name
:
"power_ground"
,
display_name
:
"power_ground"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"power_ground"
;
}},
{
name
:
"mixed"
,
display_name
:
"mixed"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"mixed"
;
}},
{
name
:
"solder_mask"
,
display_name
:
"solder_mask"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_mask"
;
}},
{
name
:
"silk_screen"
,
display_name
:
"silk_screen"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"silk_screen"
;
}},
{
name
:
"solder_paste"
,
display_name
:
"solder_paste"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_paste"
;
}},
{
name
:
"drill"
,
display_name
:
"drill"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"drill"
;
}},
{
name
:
"rout"
,
display_name
:
"rout"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"rout"
;
}},
{
name
:
"document"
,
display_name
:
"document"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"document"
;
}}
],
//defaultlayertype: "ha",
joblist
:
props
.
joblist
||
[],
defaultJob
:
props
.
defaultJob
||
[],
// select by default
steplist
:
props
.
steplist
||
[],
// defaultstep: "step3",
showstep
:
props
.
showstep
||
true
,
selectmode
:
props
.
selectmode
||
"multiple"
,
// single/multiple
layermatrix
:
props
.
layermatrix
||
{
},
defaultlayer
:
props
.
defaultlayer
||
[]
})
}
}
try
{
var
gui
=
new
NewGUI
(
GUI
)
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
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'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
(
mode
===
"aimdfm"
)
?
{
status
:
Status
,
result_data
:
resultData
}
:
"Error"
;
}
public_script/silkScreenOptimize.js
View file @
f4212ebf
...
...
@@ -9,6 +9,82 @@ PARAMETER:
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
},
{
name : 'outline',
title : 'outline',
type : 'LineEdit',
property : {tool_tip : '目标outline,默认是ol'},
},
{
name : 'units',
title : '单位',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'inch',text:'INCH'},
{name:'mm',text:'MM'},
],
tool_tip:'工作单位,未设定,默认为INCH'
},
pack : {row:1,column:1},
},
{
name : 'cover_layer_suffix',
title : '文字套层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_sm',
title : '文字距离阻焊',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_smd',
title : '文字距离SMD',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_bga',
title : '文字距离bga',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'silk_suffix',
title : '分离的文字层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'text_height',
title : '文字最大高度',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'bk_suffix',
title : '备份层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'select_lyr',
title : '选择层别',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'未设定,默认为Yes'
},
pack : {row:1,column:1},
},
{
name : 'auto_save',
title : '自动保存',
...
...
@@ -42,7 +118,7 @@ PARAMETER:
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"=============================
=>
template"
);
console
.
log
(
"=============================
:
template"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
...
...
@@ -70,11 +146,26 @@ var Status = 'ok';
var
resultData
=
[];
var
par
=
PAR
;
var
default_par
=
{
step
:
"orig"
,
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"
,
// 分离的文字层后缀
select_lyr
:
"no"
,
step
:
"unit"
,
auto_save
:
"No"
,
outline
:
"ol"
}
for
(
var
key
in
default_par
){
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}}
var
job
=
Job
;
var
outline
=
par
.
outline
var
gui
=
new
NewGUI
(
GUI
);
if
(
!
par
.
outline_size
){
par
.
outline_size
=
par
.
units
==
'inch'
?
16
:
200
;
}
try
{
if
(
_
.
isEmpty
(
job
)){
throw
"参数job不存在"
}
else
{
job
=
job
.
toLowerCase
()
}
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号"
+
job
+
"不存在"
}
...
...
@@ -82,17 +173,11 @@ 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
}
IKM
.
msg
(
123
)
var
err
=
ssFrameSeparate
()
// 分离文字和文字框
if
(
err
)
{
throw
err
}
...
...
@@ -115,3 +200,564 @@ try {
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
(
mode
===
"aimdfm"
)
?
{
status
:
Status
,
result_data
:
resultData
}
:
"Error"
;
}
// 创建套层
function
createCoverLayer
(
props
){
// 1. step过滤
var
workstep
=
getWorkStep
()
if
(
!
Array
.
isArray
(
workstep
)){
throw
"工作step错误"
}
// 2.过滤工作层
var
work_layer
=
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_layer
=
gui
.
selectMultiple
({
title
:
"请先择工作层"
,
list
:
layers
,
defaultvalue
:
work_layer
,
columns
:
4
,
gen
:
GEN
})
}
if
(
work_layer
.
length
==
0
)
{
return
"没有先择layer"
}
// 其他参数
var
info
=
gui
.
showForm
({
title
:
'请手动匹配以下信息'
,
showcheck
:
1
,
gen
:
GEN
,
defaultsize
:[
500
,
250
],
ui
:
{
type
:
'ScrollArea'
,
property
:
{
widget_resizable
:
true
,
frame_shape
:
'NoFrame'
,
align
:
'Top'
},
child
:
{
type
:
'VBoxLayout'
,
property
:
{
margin
:
2
,
spacing
:
5
,
align
:
'Top'
},
pack
:
{
stretch
:
0
},
child
:[{
type
:
"FormGridLayout"
,
property
:
{
columns
:
1
,
label_alignment
:
'Top | Right'
,
margin
:
10
,
spacing
:
20
},
pack
:
{
stretch
:
0
},
child
:[{
name
:
'ss_to_sm'
,
pack
:
{
label
:
'文字距离阻焊(单边)'
},
type
:
'LineEdit'
,
units
:
par
.
units
==
'inch'
?
'mil'
:
'um'
,
setter
:
function
(
obj
){
obj
.
setText
()
},
property
:
{
enabled
:
true
,
value
:
par
.
ss_to_sm
}
},
{
name
:
'ss_to_smd'
,
pack
:
{
label
:
'文字距离SMD(单边)'
},
type
:
'LineEdit'
,
setter
:
function
(
obj
){
obj
.
setText
()
},
units
:
par
.
units
==
'inch'
?
'mil'
:
'um'
,
property
:
{
value
:
par
.
ss_to_smd
,
enabled
:
true
}
},
{
name
:
'ss_to_bga'
,
pack
:
{
label
:
'文字距离BGA(单边)'
},
setter
:
function
(
obj
){
obj
.
setText
()
},
type
:
'LineEdit'
,
value
:
par
.
ss_to_bga
,
units
:
par
.
units
==
'inch'
?
'mil'
:
'um'
,
property
:
{
value
:
par
.
ss_to_smd
,
enabled
:
true
}
},
{
type
:
"stretch"
}]
}]
}
}
});
if
(
!
info
){
throw
"未填写参数"
}
info
=
JSON
.
parse
(
JSON
.
stringify
(
info
))
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
workstep
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
});
GEN
.
clearLayers
();
GEN
.
affectedLayer
({
mode
:
'all'
,
affected
:
'no'
});
GEN
.
units
({
type
:
par
.
units
}
);
GEN
.
zoomHome
();
work_layer
.
forEach
(
function
(
layer
){
var
cover_lyr
=
layer
+
par
.
cover_layer_suffix
;
var
sm
,
outer
;
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
cover_lyr
})
)
{
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
cover_lyr
]})
}
if
(
matrix
[
layer
].
side
==
'top'
)
{
sm
=
getLayer
({
layer_type
:
"solder_mask"
,
context
:
"board"
,
side
:
"top"
})[
0
];
outer
=
getLayer
({
layer_type
:
"signal"
,
context
:
"board"
,
side
:
"top"
})[
0
];
GEN
.
createLayer
({
job
:
job
,
layer
:
cover_lyr
,
context
:
'board'
,
type
:
'document'
,
before
:
layer
,
delete_exists
:
'yes'
});
}
else
{
sm
=
getLayer
({
layer_type
:
"solder_mask"
,
context
:
"board"
,
side
:
"bottom"
})[
0
];
outer
=
getLayer
({
layer_type
:
"signal"
,
context
:
"board"
,
side
:
"bottom"
})[
0
];
GEN
.
createLayer
({
job
:
job
,
layer
:
cover_lyr
,
context
:
'board'
,
type
:
'document'
,
before
:
layer
,
delete_exists
:
'yes'
});
}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
sm
})
)
{
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
sm
],
clear_before
:
'yes'
});
GEN
.
selectByFilter
({
polarity
:
'positive'
,
profile
:
'all'
});
GEN
.
selCopyOther
({
dest
:
'layer_name'
,
target_layer
:
cover_lyr
,
invert
:
'no'
,
size
:
2
*
info
.
ss_to_sm
});
}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
outer
})
)
{
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
outer
],
clear_before
:
'yes'
});
GEN
.
selectByFilter
({
attribute
:[
'.smd'
],
profile
:
'all'
});
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selCopyOther
({
dest
:
'layer_name'
,
target_layer
:
cover_lyr
,
invert
:
'no'
,
size
:
2
*
info
.
ss_to_smd
});}
GEN
.
selectByFilter
({
attribute
:[
'.bga'
],
profile
:
'all'
,});
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selCopyOther
({
dest
:
'layer_name'
,
target_layer
:
cover_lyr
,
invert
:
'no'
,
size
:
2
*
info
.
ss_to_bga
});}
}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
outline
})
)
{
var
outline_tmp
=
outline
+
'_tmp_tl'
;
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
outline
,
dest_layer
:
outline_tmp
,
mode
:
'replace'
,
invert
:
'no'
})
;
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
outline_tmp
],
clear_before
:
'yes'
});
GEN
.
selectByFilter
({
feat_types
:
'line
\
;arc'
,
polarity
:
'positive'
,
profile
:
'all'
});
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selChangeSym
({
symbol
:
'r'
+
par
.
outline_size
})
}
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
outline_tmp
,
dest_layer
:
cover_lyr
,
mode
:
'append'
,
invert
:
'no'
})
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
outline_tmp
],
step
:
step
});
}
})
})
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
})
GEN
.
clearLayers
()
}
// 字符 和 文字框分开
function
ssFrameSeparate
()
{
// 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
info
=
gui
.
showForm
({
title
:
'请手动匹配以下信息'
,
showcheck
:
1
,
gen
:
GEN
,
defaultsize
:[
500
,
250
],
ui
:
{
type
:
'ScrollArea'
,
property
:
{
widget_resizable
:
true
,
frame_shape
:
'NoFrame'
,
align
:
'Top'
},
child
:
{
type
:
'VBoxLayout'
,
property
:
{
margin
:
2
,
spacing
:
5
,
align
:
'Top'
},
pack
:
{
stretch
:
0
},
child
:[{
type
:
"FormGridLayout"
,
property
:
{
columns
:
1
,
label_alignment
:
'Top | Right'
,
margin
:
10
,
spacing
:
20
},
pack
:
{
stretch
:
0
},
child
:[{
name
:
'text_height'
,
pack
:
{
label
:
'文字最大高度'
},
type
:
'LineEdit'
,
setter
:
function
(
obj
){
obj
.
setText
()
},
property
:
{
value
:
par
.
text_height
*
1000
,
enabled
:
true
},
units
:
par
.
units
==
'inch'
?
'mil'
:
'um'
},{
name
:
'type'
,
pack
:
{
label
:
'类型'
},
type
:
'RadioBox'
,
property
:
{
enabled
:
true
,
item_list
:[{
name
:
'separate'
,
text
:
'字框分离'
},{
name
:
"change"
,
text
:
"字框切换"
}]}
},
{
type
:
"stretch"
}]
}]
}
}
});
if
(
!
info
){
throw
"未填写参数"
}
info
=
JSON
.
parse
(
JSON
.
stringify
(
info
));
if
(
info
.
type
==
""
){
info
.
type
=
"separate"
}
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
workstep
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
});
GEN
.
clearLayers
();
GEN
.
affectedLayer
({
mode
:
'all'
,
affected
:
'no'
}
);
GEN
.
units
({
type
:
par
.
units
});
GEN
.
zoomHome
();
var
layer_count
=
GEN
.
getLayerCount
({
job
:
job
})
// IKM.get_jobinfo({jobid: JobId, jobinfo: "layer_count"})
GEN
.
COM
(
'disp_off'
);
if
(
info
[
"type"
]
==
'separate'
)
{
work_layers
.
forEach
(
function
(
layer
){
// 备份文字层
var
bk
=
layer
+
par
.
bk_suffix
;
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
layer
,
dest_layer
:
bk
,
mode
:
'replace'
,
invert
:
'no'
})
// 分离出的文字层
var
ss_text
=
layer
+
par
.
silk_suffix
;
if
(
matrix
[
layer
][
"side"
]
==
'top'
)
{
GEN
.
createLayer
({
job
:
job
,
layer
:
ss_text
,
context
:
'board'
,
type
:
'document'
,
before
:
layer
,
delete_exists
:
'yes'
});
}
else
{
GEN
.
createLayer
({
job
:
job
,
layer
:
ss_text
,
context
:
'board'
,
type
:
'document'
,
after
:
layer
,
delete_exists
:
'yes'
});
}
// 开始分离文字
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:
layer
,
clear_before
:
'yes'
});
GEN
.
COM
(
"filter_reset,filter_name=popup"
);
GEN
.
selectByFilter
({
feat_types
:
'line
\
;arc'
,
polarity
:
'positive'
,
profile
:
'all'
});
if
(
GEN
.
getSelectCount
()
>
0
){
var
ss_line_arc
=
layer
+
'_line_arc_tl_script'
;
selCopyOther
({
layer
:
ss_line_arc
,
delExist
:
true
})
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:
ss_line_arc
,
clear_before
:
'yes'
});
GEN
.
selChangeSym
({
symbol
:
'r0.2'
});
GEN
.
COM
(
"filter_reset,filter_name=popup"
);
GEN
.
selectByFilter
({
feat_types
:
'line'
,
polarity
:
'positive'
,
profile
:
'all'
});
//将直线固定角度分离去除
var
ss_line
=
layer
+
'_line_tl_script'
;
if
(
GEN
.
getSelectCount
()
>
0
){
selCopyOther
({
layer
:
ss_line
,
delExist
:
true
})
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:
ss_line
,
clear_before
:
'yes'
});
var
angle
=
[];
var
tol
=
0.2
;
if
(
GEN
.
GEN_TYPE
==
'genesis'
){
angle
=
[
-
180
,
-
135
,
-
90
,
-
45
,
0
,
45
,
90
,
135
];
}
else
{
angle
=
[
0
,
45
,
90
,
135
,
180
,
225
,
270
,
315
];
}
angle
.
forEach
(
function
(
angl
){
if
(
GEN
.
GEN_TYPE
==
'genesis'
){
var
min_angle
=
(
angl
-
tol
<
-
180
)
?
-
180
:
(
angl
-
tol
);
var
max_angle
=
(
angl
+
tol
>
180
)
?
180
:
(
angl
+
tol
);
GEN
.
COM
(
'filter_set'
,{
filter_name
:
'popup'
,
update_popup
:
'yes'
,
slot
:
'line'
,
slot_by
:
'angle'
,
min_angle
:
min_angle
,
max_angle
:
max_angle
});
}
else
{
GEN
.
COM
(
'set_filter_angle'
,{
direction
:
'ccw'
,
max_angle
:
angl
+
tol
,
min_angle
:
angl
-
tol
,
slot
:
'lines'
});
GEN
.
COM
(
"adv_filter_set,ccw_rotations=,filter_name=popup,mirror=any,bound_box=no,active=yes,srf_values=no,srf_area=no,limit_box=no"
);
}
GEN
.
COM
(
"filter_area_strt"
);
GEN
.
COM
(
"filter_area_end,filter_name=popup,operation=select"
);
})
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selDelete
()}
}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
ss_line
})){
// 利用制作的套层
var
cover_lyr
=
layer
+
par
.
cover_layer_suffix
;
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
cover_lyr
],
clear_before
:
'yes'
});
GEN
.
COM
(
"filter_reset,filter_name=popup"
);
GEN
.
COM
(
"filter_set,filter_name=popup,update_popup=no,include_syms=r*"
);
GEN
.
COM
(
"filter_set,filter_name=popup,update_popup=no,exclude_syms=rect*"
);
GEN
.
COM
(
"filter_area_strt"
);
GEN
.
COM
(
"filter_area_end,filter_name=popup,layer=,operation=select,inside_area=no,intersect_area=no,area_type=none"
);
GEN
.
COM
(
"filter_reset,filter_name=popup"
);
GEN
.
COM
(
"sel_reverse"
);
var
cover_lyr_2
=
cover_lyr
+
'_tmp_tl'
;
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
();
if
(
GEN
.
GEN_TYPE
==
'incam'
){
GEN
.
COM
(
"reset_filter_criteria,filter_name=,criteria=all"
);
}
else
{
GEN
.
COM
(
"filter_atr_reset,filter_name=ref_select"
);
}
GEN
.
COM
(
"sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line
\
;pad
\
;surface
\
;arc
\
;text,polarity=positive
\
;negative,layers="
+
ss_line
);
var
layer_tmp1
=
layer
+
'_tmp1_tl'
;
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
createLayer
({
job
:
job
,
layer
:
layer_tmp1
,
delete_exists
:
'yes'
});
GEN
.
selMoveOther
({
target_layer
:
layer_tmp1
,
invert
:
'no'
});
}
if
(
GEN
.
GEN_TYPE
==
'incam'
){
GEN
.
COM
(
"reset_filter_criteria,filter_name=,criteria=all"
);
}
else
{
GEN
.
COM
(
"filter_atr_reset,filter_name=ref_select"
);
}
GEN
.
COM
(
"sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line
\
;pad
\
;surface
\
;arc
\
;text,polarity=positive
\
;negative,layers="
+
cover_lyr_2
);
var
layer_tmp2
=
layer
+
'_tmp2_tl'
;
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
createLayer
({
job
:
job
,
layer
:
layer_tmp2
,
delete_exists
:
'yes'
});
GEN
.
selCopyOther
({
target_layer
:
layer_tmp2
,
invert
:
'no'
});
}
GEN
.
COM
(
"sel_clean_surface,max_fold_len=0,clean_size="
+
info
.
text_height
+
",clean_mode=x_and_y,accuracy=0"
);
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
"layer_tmp2"
}))
{
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
layer_tmp2
],
clear_before
:
'yes'
});
if
(
GEN
.
GEN_TYPE
==
'incam'
){
GEN
.
COM
(
"reset_filter_criteria,filter_name=,criteria=all"
);
}
else
{
GEN
.
COM
(
"filter_atr_reset,filter_name=ref_select"
);
}
GEN
.
COM
(
"sel_ref_feat,pads_as=shape,mode=disjoint,exclude_syms=,include_syms=,use=filter,f_types=line
\
;pad
\
;surface
\
;arc
\
;text,polarity=positive
\
;negative,layers="
+
ss_line_arc
);
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selMoveOther
({
target_layer
:
layer_tmp1
,
invert
:
'no'
});
}
}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
layer_tmp1
}))
{
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
layer_tmp1
],
clear_before
:
'yes'
});
if
(
GEN
.
GEN_TYPE
==
'incam'
){
GEN
.
COM
(
"reset_filter_criteria,filter_name=,criteria=all"
);
}
else
{
GEN
.
COM
(
"filter_atr_reset,filter_name=ref_select"
);
}
GEN
.
COM
(
"sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line
\
;pad
\
;surface
\
;arc
\
;text,polarity=negative,layers="
+
layer
);
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selDelete
()
};
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:[
layer
],
clear_before
:
'yes'
});
if
(
GEN
.
GEN_TYPE
==
'incam'
){
GEN
.
COM
(
"reset_filter_criteria,filter_name=,criteria=all"
);
}
else
{
GEN
.
COM
(
"filter_atr_reset,filter_name=ref_select"
);
}
GEN
.
COM
(
"sel_ref_feat,pads_as=shape,mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line
\
;pad
\
;surface
\
;arc
\
;text,polarity=positive
\
;negative,layers="
+
layer_tmp1
);
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selMoveOther
({
target_layer
:
ss_text
,
invert
:
'no'
});
}
}
// 将文字属性挑选
GEN
.
COM
(
"filter_reset,filter_name=popup"
);
GEN
.
selectByFilter
({
feat_types
:
'text'
}
);
if
(
GEN
.
getSelectCount
()
>
0
){
GEN
.
selMoveOther
({
target_layer
:
ss_text
,
invert
:
'no'
});
}
delLayer
([
ss_line_arc
,
ss_line
,
cover_lyr_2
,
layer_tmp1
,
layer_tmp2
]);
}
}
})
}
GEN
.
COM
(
"disp_on"
)
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("没有找到文字框和对应的文字层,程序将退出。")
// }
})
}
// 文字框按阻焊扩大
// 文字放大
function
selCopyOther
(
props
){
// {layer , invent, dx, dy , size}
if
(
GEN
.
getSelectCount
()
>
0
){
if
(
!
props
||
!
props
.
layer
){
return
}
if
(
props
.
delExist
){
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
props
.
layer
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
props
.
layer
]})}}
GEN
.
selCopyOther
({
dest
:
'layer_name'
,
target_layer
:
props
.
layer
,
invert
:
props
.
invert
||
'no'
,
dx
:
props
.
dx
||
0
,
dy
:
props
.
dy
||
0
,
size
:
props
.
size
||
0
})
}
}
function
getLayer
(
props
){
if
(
!
props
){
return
}
if
(
!
props
.
context
){
props
.
context
=
"board"
}
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
return
Object
.
keys
(
matrix
).
reduce
(
function
(
a
,
b
){
var
info
=
matrix
[
b
];
var
ret
=
true
;
for
(
var
key
in
props
)
{
if
(
!
Array
.
isArray
(
props
[
key
])){
props
[
key
]
=
[
props
[
key
]]}
if
(
info
[
key
]
&&
props
[
key
].
indexOf
(
info
[
key
])
<
0
){
ret
=
false
}
}
if
(
ret
){
a
.
push
(
props
.
res
==
"info"
?
info
:
b
)
}
return
a
},[])
}
function
NewGUI
(
gui
)
{
this
.
msgBox
=
function
(
props
){
// title type content button
props
=
props
||
{}
return
gui
.
msgBox
(
props
.
title
||
"title"
,
props
.
type
||
"info"
,
props
.
content
||
"content"
,
props
.
button
||
[
"ok"
,
"cancel"
]);
}
this
.
selectFromTreeview
=
gui
.
selectFromTreeview
this
.
confirm
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
confirm
(
props
.
content
||
"content"
,
props
.
button
||
[
"yes"
,
"no"
],
props
.
type
||
"question"
);
}
this
.
selectFile
=
function
(
props
){
// "choose something", "*", true, "file", "/home/abby/fast_io"
props
=
props
||
{}
return
gui
.
selectFile
(
props
.
title
||
"choose something"
,
props
.
filter
||
"*"
,
props
.
multiple
||
false
,
"file"
,
""
);
}
this
.
selectSingle
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
selectSingle
({
"title"
:
props
.
title
||
"select"
,
"list"
:
props
.
list
||
[],
"default"
:
props
[
"default"
]
||
""
,
"columns"
:
props
.
columns
||
2
,
"gen"
:
props
.
gen
||
GEN
});
}
this
.
selectMultiple
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
selectMultiple
({
"title"
:
props
.
title
||
"select"
,
"list"
:
props
.
list
||
[],
"defaultvalue"
:
props
[
"defaultvalue"
]
||
[
""
],
"columns"
:
props
.
columns
||
2
,
"gen"
:
props
.
gen
||
GEN
});
}
this
.
selectFromTable
=
gui
.
selectFromTable
this
.
snapScreen
=
gui
.
snapScreen
this
.
imageViewer
=
gui
.
imageViewer
this
.
inputBox
=
gui
.
inputBox
this
.
showForm
=
gui
.
showForm
this
.
selectLayer
=
function
(
props
){
props
=
props
||
{}
return
gui
.
selectLayer
({
title
:
props
.
title
||
"请选择层"
,
filter
:
props
.
filter
||
".*"
,
// regular expression
selectmode
:
props
.
selectmode
||
"multiple"
,
// single, multiple
context
:
props
.
context
||
"all"
,
// all, board, misc
layertype
:
props
.
layertype
||
"signal"
,
// default type of layertypelist
defaultsize
:
props
.
defaultsize
||
[
600
,
400
],
// window size
layermatrix
:
props
.
layermatrix
||
props
.
matrix
,
layertypelist
:
props
.
layertypelist
||
[
{
name
:
"all"
,
display_name
:
"all"
,
filter
:
function
(
x
)
{
return
x
}},
{
name
:
"signal"
,
display_name
:
"signal"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"signal"
;
}},
{
name
:
"power_ground"
,
display_name
:
"power_ground"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"power_ground"
;
}},
{
name
:
"mixed"
,
display_name
:
"mixed"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"mixed"
;
}},
{
name
:
"solder_mask"
,
display_name
:
"solder_mask"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_mask"
;
}},
{
name
:
"silk_screen"
,
display_name
:
"silk_screen"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"silk_screen"
;
}},
{
name
:
"solder_paste"
,
display_name
:
"solder_paste"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_paste"
;
}},
{
name
:
"drill"
,
display_name
:
"drill"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"drill"
;
}},
{
name
:
"rout"
,
display_name
:
"rout"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"rout"
;
}},
{
name
:
"document"
,
display_name
:
"document"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"document"
;
}}
],
gen
:
props
.
GEN
||
GEN
})
}
this
.
lockUnlockLayer
=
function
(
props
){
props
=
props
||
{}
var
tmp
=
{}
if
(
props
.
matrix
)
{
for
(
var
key
in
props
.
matrix
)
{
var
item
=
props
.
matrix
[
key
]
tmp
[
key
]
=
{
row
:
item
.
row
,
name
:
item
.
name
}
}
}
return
gui
.
lockUnlockLayer
({
title
:
props
.
title
||
"lockUnlockLayer"
,
layermatrix
:
props
.
layermatrix
||
tmp
})
}
this
.
passwordBox
=
function
(
props
){
props
=
props
||
{}
return
gui
.
passwordBox
({
title
:
props
.
title
||
"password"
,
password
:
props
.
password
||
"1212"
})
}
this
.
selectJobLayer
=
function
(
props
)
{
props
=
props
||
{}
return
gui
.
selectJobLayer
({
layertypelist
:
props
.
layertypelist
||
[
{
name
:
"all"
,
display_name
:
"all"
,
filter
:
function
(
x
)
{
return
x
}},
{
name
:
"signal"
,
display_name
:
"signal"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"signal"
;
}},
{
name
:
"power_ground"
,
display_name
:
"power_ground"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"power_ground"
;
}},
{
name
:
"mixed"
,
display_name
:
"mixed"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"mixed"
;
}},
{
name
:
"solder_mask"
,
display_name
:
"solder_mask"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_mask"
;
}},
{
name
:
"silk_screen"
,
display_name
:
"silk_screen"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"silk_screen"
;
}},
{
name
:
"solder_paste"
,
display_name
:
"solder_paste"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"solder_paste"
;
}},
{
name
:
"drill"
,
display_name
:
"drill"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"drill"
;
}},
{
name
:
"rout"
,
display_name
:
"rout"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"rout"
;
}},
{
name
:
"document"
,
display_name
:
"document"
,
filter
:
function
(
x
)
{
return
x
[
"layer_type"
]
===
"document"
;
}}
],
//defaultlayertype: "ha",
joblist
:
props
.
joblist
||
[],
defaultJob
:
props
.
defaultJob
||
[],
// select by default
steplist
:
props
.
steplist
||
[],
// defaultstep: "step3",
showstep
:
props
.
showstep
||
true
,
selectmode
:
props
.
selectmode
||
"multiple"
,
// single/multiple
layermatrix
:
props
.
layermatrix
||
{
},
defaultlayer
:
props
.
defaultlayer
||
[]
})
}
}
function
getWorkStep
(
props
){
var
steplists
=
GEN
.
getStepList
({
job
:
job
});
if
(
steplists
.
length
==
0
){
return
"该料号没有step"
}
var
steps_tmp
=
steplists
.
filter
(
function
(
name
){
var
reg
=
new
RegExp
(
par
.
step
,
"ig"
)
return
reg
.
test
(
name
)
})
if
(
steplists
.
length
==
0
){
return
"根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!"
}
var
workstep
=
gui
.
selectMultiple
({
title
:
"请先择工作step"
,
list
:
steplists
.
map
(
function
(
v
){
var
tmp
=
{};
tmp
[
v
]
=
v
;
return
tmp
}),
defaultvalue
:
steps_tmp
,
columns
:
1
,
gen
:
GEN
})
if
(
workstep
.
length
==
0
)
{
return
"没有先择step"
}
return
workstep
}
function
delLayer
(
layer
){
if
(
!
Array
.
isArray
(
layer
)){
layer
=
[
layer
]
}
layer
=
layer
.
filter
(
function
(
v
){
return
GEN
.
isLayerExists
({
job
:
job
,
layer
:
v
})})
if
(
layer
.
length
){
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
layer
]})
}
}
\ No newline at end of file
public_script/字符优化/TL_text_optimization.pl
0 → 100644
View file @
f4212ebf
=head
NAME:
DESCRIPTION: 放大文字框
PARAMETER:
[
{
name : 'step_filter',
title : '工作Step',
type : 'LineEdit',
property:{tool_tip:''}
},
{
name : 'ss_suffix',
title : '分离文字字符层层后缀',
type : 'LineEdit',
property:{tool_tip:'如未设置,则默认为:-ref'},
},
{
name : 'sm_ref',
title : '文字辅助层后缀',
type : 'LineEdit',
property:{tool_tip:'如未设置,则默认为:-ref'},
},
{
name : 'is_select_lyr',
type : 'RadioBox',
title : '是否选择层别',
property : {tool_tip:'未设定,则默认no',
size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'del_backup',
type : 'RadioBox',
title : '删除TL备份层',
property : {tool_tip:'未设定,则默认yes',size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'Yes',text:'Yes'},
{name:'No',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2017-3-22 Cody Yu
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>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
=cut
use
strict
;
use
Encode
;
use
utf8
;
use
Data::
Dump
'dump'
;
my
(
$Job
,
$Step
)
=
(
$JOB
,
undef
);
$PAR
->
{
is_select_lyr
}
=
$PAR
->
{
is_select_lyr
}
||
'no'
;
$PAR
->
{
del_backup
}
=
'yes'
unless
$PAR
->
{
del_backup
};
$PAR
->
{
sm_ref
}
=
'-ref'
unless
$PAR
->
{
sm_ref
};
$PAR
->
{
save_job
}
=
'No'
unless
$PAR
->
{
save_job
};
my
$Return
=
'done'
;
my
$units
=
'inch'
;
$PAR
->
{
crate_tmp
}
=
'yes'
unless
$PAR
->
{
crate_tmp
};
$PAR
->
{
tol
}
=
1
;
try
{
##
show_loading
(
"判断是否选择料号.."
,
0
,
position
=>
'n'
);
unless
(
$Job
){
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
"请先选择料号后再执行脚本!"
);
return
'Cancel'
;
}
update_loading
(
"检查${Job}是否存在.."
,
0
,
position
=>
'n'
);
##检查料号是否存在
unless
(
$GEN
->
isJobExists
(
job
=>
$Job
)
){
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
"料号 $Job 不存在,请确认。"
);
return
'Cancel'
;
}
update_loading
(
"正在打开料号$Job..."
,
0
,
position
=>
'n'
);
$GEN
->
openJob
(
job
=>
$Job
)
unless
(
$GEN
->
isJobOpen
(
job
=>
$Job
));
###选择工作step
update_loading
(
"过滤工作step..."
,
0
,
position
=>
'n'
);
my
@steps
=
$GEN
->
getStepList
(
job
=>
$Job
);
if
(
@steps
==
0
)
{
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
'在料号中没有Step存在,你将退出!'
);
return
0
;
}
elsif
(
@steps
!=
1
){
$PAR
->
{
step_filter
}
=
'.*'
unless
$PAR
->
{
step_filter
};
my
@tmp_steps
=
grep
(
/$PAR->{step_filter}/
,
@steps
);
if
(
@tmp_steps
==
0
)
{
$GUI
->
msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的s
tep
不存在,请检查资料或者脚本参数配置!
');
return '
Cancel
';
}
elsif ( @tmp_steps == 1 ) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'
请选择工作
Step
',
-steplist=>[@tmp_steps],
-selectmode=>'
single
');
return '
Cancel
' unless ($Step);
}
}
else {
$Step = $steps[0];
}
$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=>$units );
$GEN->zoomHome();
##过滤 board layers
update_loading("过滤工作层...",0,position=>'
n
');
my @work_layers = get_work_layer();
return '
Cancel
' if $work_layers[0] eq '
Cancel
';
##创建辅助层
$PAR->{crate_tmp} = '
no
';
if( $PAR->{crate_tmp} =~ /yes/i ){
update_loading("正在创建文字层对应的防焊参考层,请稍候...",0,position=>'
n
');
foreach my $layer(@work_layers){
my $sm_layer = $layer eq '
c1
' ? '
m1
' : '
m2
';
my $ref_layer = $layer.'
-
cover
+
';
next unless ( $GEN->isLayerExists(job=>$Job,layer=>$sm_layer) );
if( $layer =~ /^c2/ ){
$GEN->createLayer(job=>$Job,layer=>$ref_layer,context=>'
misc',type=>'document',after=>$layer) unless( $GEN->isLayerExis
ts
(
job
=>
$Job
,
layer
=>
$ref_layer
)
);
}
else
{
$GEN
->
createLayer
(
job
=>
$Job
,
layer
=>
$ref_layer
,
context
=>
'misc'
,
type
=>
'document'
,
before
=>
$layer
)
unless
(
$GEN
->
isLayerExists
(
job
=>
$Job
,
layer
=>
$ref_layer
)
);
}
$GEN
->
copyLayer
(
source_job
=>
$Job
,
source_step
=>
$Step
,
source_layer
=>
$sm_layer
,
dest_layer
=>
$ref_layer
,
mode=>'replace',invert=>'no
');
$GEN->affectedLayer(affected=>'
yes
',layer=>[$ref_layer],clear_before=>'
yes
');
$GEN->selContourize();
$GEN->COM('
sel_resize
',size=>10,corner_ctl=>'
no
');
}
}
foreach my $layer(@work_layers){
if ($GEN->isLayerExists(job=>$Job,layer=>$layer.$PAR->{ss_suffix})) {
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$layer.$PAR->{ss_suffix},dest_layer=>$layer.'
_tl
+++
',mode=>'
replace
',invert=>'
no
');
}else{
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$layer,dest_layer=>$layer.'
_tl
+++
',mode=>'
replace
',invert=>'
no
');
}
}
# 开始放大文字框
my $default_layer = $work_layers[0];
my $ref_layer = $work_layers[0].$PAR->{sm_ref};
if ($GEN->isLayerExists(job=>$Job,layer=>$work_layers[0].$PAR->{ss_suffix})) {
$default_layer = $work_layers[0].$PAR->{ss_suffix};
}
##
my ($tmp1,$tmp2) = ('
tl_script_tmp1
','
tl_script_tmp2
');
##
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
#$GEN->createLayer(job=>$Job,layer=>$tmp1,context=>'
misc
',type=>'
document
');
#$GEN->createLayer(job=>$Job,layer=>$tmp2,context=>'
misc
',type=>'
document
');
##
$GEN->workLayer(name=>$default_layer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2) if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
my %info;
$info{type} = '
silk_text
';
$info{scale_type} = '
scale
';
$info{x} = $info{y} = 1.05;
$info{text_x} = $info{text_y} = 1.05;
$info{text_space} = 10;
while(1){
update_loading("请确认文字放大参数,不再继续制作请点取消!",0,position=>'
n
');
%info = $GUI->show_form(
-title => '
请确认信息:
',
-showcheck => 1,-gen=>$GEN,
-defaultsize=>[380,300],
-columns =>'
2
',
-excludehideitem=>1,
-items=>[
{
name=>'
type
',
label=>'
类型
',
type=>'
radio
',
col_span=>2,
property=>{
tl_columns=>2,
tl_list=>['
silk_text
'=>'
放大字符
','
silk_frame
'=>'
放大文字框
',],
},
must_field=>1,
value=>$info{type},
validate_func=>sub{
my %par=@_;
return{} if $par{mode} eq '
save
';
if (defined $par{value} and $par{value} eq '
silk_text
'){
$par{formpanel}->set_item_visible(title2=>1);
$par{formpanel}->set_item_visible(text_type=>1);
$par{formpanel}->set_item_visible(title1=>0);
$par{formpanel}->set_item_visible(scale_type=>0);
$par{formpanel}->set_value(scale_type=>$info{scale_type}||'
scale
');
}
else{
$par{formpanel}->set_item_visible(title2=>0);
$par{formpanel}->set_item_visible(text_type=>0);
$par{formpanel}->set_value(text_type=>$info{text_type}||'
single
');
$par{formpanel}->set_item_visible(title1=>1);
$par{formpanel}->set_item_visible(scale_type=>1);
}
return {};
},
},
{
name=>'
title1
',
type=>'
frame
',
property=>{label=>'
放大字符框参数
:
'},
expand=>1,
},
{
name=>'
scale_type
',
label=>'
模式
',
type=>'
radio
',
col_span=>2,
property=>{
tl_columns=>2,
tl_list=>['
scale
'=>'
按比例放大
','
value
'=>'
按间距放大
'],
},
must_field=>1,
value=>$info{scale_type},
validate_func=>sub{
my %par=@_;
return{} if $par{mode} eq '
save
';
if (defined $par{value} and $par{value} eq '
value
'){
$par{formpanel}->set_item_visible(x=>0);
$par{formpanel}->set_item_visible(y=>0);
$par{formpanel}->set_item_visible(value_x=>1);
$par{formpanel}->set_item_visible(value_y=>1);
}
else{
$par{formpanel}->set_item_visible(x=>1);
$par{formpanel}->set_item_visible(y=>1);
$par{formpanel}->set_item_visible(value_x=>0);
$par{formpanel}->set_item_visible(value_y=>0);
}
return {};
},
},
{
name => '
x
',
label => '
X
',
type => '
number
',
value=>$info{x}||1.05,
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('
scale_type
');
if ($value eq '
scale
'){
return '
show
';
}
else{
return '
hide
';
}
},
},
{
name => '
y
',
label => '
Y
',
type => '
number
',
value=>$info{y}||1.05,
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('
scale_type
');
if ($value eq '
scale
'){
return '
show
';
}
else{
return '
hide
';
}
},
},
{
name => '
value_x
',
label => '
X
',
type => '
number
',
units=>'
mil
',
must_field=>1,
value=>$info{value_x},
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('
scale_type
');
if ($value eq '
value
'){
return '
show
';
}
else{
return '
hide
';
}
},
},
{
name => '
value_y
',
label => '
Y
',
type => '
number
',
units=>'
mil
',
must_field=>1,
value=>$info{value_y},
visible_func => sub{
my %par = @_;
my $value = $par{formpanel}->get_value('
scale_type
');
if ($value eq '
value
'){
return '
show
';
}
else{
return '
hide
';
}
},
},
{
name=>'
title2
',
type=>'
frame
',
property=>{label=>'
放大字符参数
:
'},
expand=>1,
},
{
name=>'
text_type
',
label=>'
模式
',
type=>'
radio
',
col_span=>2,
property=>{
tl_columns=>2,
tl_list=>['
layer
'=>'
自动放大
','
single
'=>'
单个放大
'],
},
must_field=>1,
value=>$info{text_type}||'
single
',
},
{
name => '
text_x
',
label => '
X
',
type => '
number
',
value=>$info{text_x}||1.05,
},
{
name => '
text_y
',
label => '
Y
',
type => '
number
',
value=>$info{text_y}||1.05,
},
{
name => '
text_space
',
label => '
字符间距
',
type => '
number
',
units=>'
mil
',
value=>$info{text_space}||10,
},
]
);
return $Return unless %info;
if( $info{type} eq '
silk_frame
' ){
$default_layer = enlarge_slik_frame(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $default_layer if $default_layer eq '
Cancel
';
}
else{
if( $info{text_type} eq '
layer
' ){
my $ans = enlarge_slik_layer(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $ans if $ans;
}
else{
$default_layer = enlarge_text_single(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $default_layer if $default_layer eq '
Cancel
';
}
}
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
}
if ($PAR->{del_backup} eq '
yes
'){
foreach my $layer(@work_layers){
$GEN->deleteLayer(job=>$Job,layer=>[$layer.'
_tl
+++
']) ;
}
}
$GEN->affectedLayer(mode=>'
all
',affected=>'
no
');
update_loading("【 放大文字框 】完成..",1,position=>'
n
');
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("$Job 正在保存料号,请稍候...",0,position=>'
n
');
$GEN->checkInout(job=>$Job,mode=>'
out
');
$GEN->saveJob(job=>$Job);
hide_loading();
}
unless ($GEN->{STATUS}){
return $Return;
}
else{
$GEN->COM('
disp_on
');
$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 = shift;
$GEN->COM('
disp_on
');
$GUI->msgbox(-icon=>'
error
',-text=>$error);
return '
Error
';
}
finally{
$GEN->COM('
disp_on
');
};
sub get_work_layer{
my %par = @_;
update_loading("过滤层别...",0,position=>'
n
');
my @silk;
# 获取工作层
my %matrix = $GEN->getMatrix(job=>$Job,type=>'
hash
');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq '
board
' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq '
silk_screen
' ){
push @silk,$layer;
}
}
}
unless( @silk ){
$GUI->msgbox(-icon=>'
warning
',-text=>'
资料中无文字层,请确认
');
return '
Cancel
';
}
if ($PAR->{is_select_lyr} eq '
yes
' and scalar @silk > 1) {
my (%tmp_matrix);
foreach my $layer (@silk) {
$tmp_matrix{$layer} = $matrix{$layer};
}
@silk = $GUI->select_layer(
-title=>'
请选择工作层别
',
-layermatrix=>\%tmp_matrix,
-selectmode => '
multiple
');#single
return '
Cancel
' unless(@silk);
}
return @silk;
}
sub enlarge_slik_frame{
my %par = @_;
my $default_layer = $par{default_layer};
#$GUI->debug(dump('
---
111
',$default_layer));
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
while(1){
#$GEN->affectedLayer(affected=>'
yes
',layer=>[$tmp1,$tmp2],clear_before=>'
yes
');
#$GEN->selDelete();
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$default_layer = undef;
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Set
Work
Layer
');
return '
Cancel
' unless $ans eq '
OK
';
}
}
$ref_layer = $work_layer.$PAR->{sm_ref};
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
update_loading("请选择需按当前比例放大的文字框,不需制作了请【左键框选空白处】",0,position=>'
n
');
my %tmp_con;
if($info{scale_type} eq '
scale
'){
%tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select! Scale x:$info{x} y:$info{y}");
}
else{
%tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select! Space x:$info{value_x} mil y:$info{value_y} mil");
}
$work_layer = $GEN->getWorkLayer();
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'
warning
',-text=>'
没有设定工作层,程序无法继续下去!
');
return '
Cancel
';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$tmp1,invert=>'
no
');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',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->selCopyOther(target_layer=>$tmp1,invert=>'
no
');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',invert=>'
no
');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
$default_layer = $GEN->getWorkLayer();
last;
}
}
$GEN->COM('
disp_off
');
$GEN->units( type=>$units );
##获取涨缩信息
my $text_tmp = '
tl_tmp_text
';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$text_tmp,mode=>'
replace
',invert=>'
no
');
$GEN->affectedLayer(affected=>'
yes
',layer=>[$text_tmp],clear_before=>'
yes
');
$GEN->selectByFilter(feat_types=>'
line
\
;
arc
',polarity=>'
positive
',profile=>'
all
');
$GEN->COM('
sel_change_sym
', symbol => '
r0
')if ( $GEN->getSelectCount() > 0 );
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$text_tmp,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley);
if( $info{scale_type} eq '
scale
' ){
$scalex = $info{x};
$scaley = $info{y};
}
else{
#my $new_limits;
#$new_limits->{xsize} = $layer_limits->{xsize}+($info{value_x}/1000)*2;
#$new_limits->{ysize} = $layer_limits->{ysize}+($info{value_y}/1000)*2;
#$scalex = $new_limits->{xsize}/$layer_limits->{xsize};
#$scaley = $new_limits->{ysize}/$layer_limits->{ysize};
$scalex = 1 + ($info{value_x}*2)/($layer_limits->{xsize}*1000);
$scaley = 1 + ($info{value_y}*2)/($layer_limits->{ysize}*1000);
}
$GEN->deleteLayer(job=>$Job,layer=>[$text_tmp]);
##
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'
yes
');
$GEN->selTransform(mode=>'
anchor
',oper=>'
scale
',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley);
my $tmp_symbol = '
tl_script_tmp
';
#$GEN->COM( "delete_entity,job=$Job,type=symbol,name=$tmp_symbol" ) if( $GEN->isSymbolExists(job=>$Job,symbol=>$tmp_symbol) );
$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);
$GEN->selBreak()if ( $GEN->getSelectCount() > 0 );
$GEN->COM('
disp_on
');
$default_layer = $GEN->getWorkLayer();
$GEN->COM('
truncate_layer
', layer =>$tmp1);
$GEN->COM('
truncate_layer
', layer =>$tmp2);
if( $GEN->{STATUS} ){
#$GEN->COM('
disp_on
');
$GUI->msgbox(-icon=>'
error
',-text=>join("\n",@{$GEN->{STATUS}}));
return '
Error
';
}
$GEN->units(type=>$units);
}
return $default_layer;
}
sub enlarge_slik_layer{
my %par = @_;
my $default_layer = $par{default_layer};
my %info = %{$par{info}};
my ($curlayer,$testlayer) = ($par{tmp1},$par{tmp2});
while(1){
update_loading("请将需要放大的文字move到一个辅助层上并设为工作层...",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Set
Layer
');
return '
Cancel
' unless $ans eq '
OK
';
$curlayer = $GEN->getWorkLayer();
last unless $curlayer;
unless ( $GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$curlayer) ){
$GEN->affectedLayer(affected=>'
yes
',layer=>[$curlayer],clear_before=>'
yes
');
$GEN->selCopyOther(target_layer=>$testlayer,invert=>'
no
',size=>$info{text_space});
}
else{
last;
}
update_loading("正在放大$curlayer 层上字符,请稍候...",0,position=>'
n
');
my $ref_layer = '
tl_silk_layer
';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$curlayer,dest_layer=>$ref_layer,mode=>'
replace
',invert=>'
no
');
$GEN->COM('
disp_off
');
$GEN->units( type=>$units );
##获取涨缩信息
$GEN->affectedLayer(affected=>'
yes
',layer=>[$testlayer],clear_before=>'
yes
');
$GEN->selContourize(accuracy=>0.25,clean_hole_size=>3,clean_hole_mode=>'
x_and_y
');
$GEN->workLayer(name=>$curlayer,display_number=>1,clear_before=>'
yes
');
$GEN->affectedLayer(affected=>'
yes
',layer=>[$testlayer]);
# $GEN->PAUSE('
AAAAA
');
my $index = 1;
while( 1 ) {
$GEN->COM("reset_filter_criteria,filter_name=popup,criteria=all");
$GEN->COM('
filter_reset
',filter_name=>'
popup
');
$GEN->COM("adv_filter_reset");
$GEN->COM("reset_filter_criteria,filter_name=,criteria=all");
$GEN->COM('
adv_filter_set
',filter_name=>'
popup
',update_popup=>'
yes
',indexes=>$index);
$GEN->COM('
filter_area_strt
');
$GEN->COM('
filter_area_end
',layer=>$testlayer,filter_name=>'
popup
',operation=>'
select
',area_type=>'
none
',inside_area=>'
no
',intersect_area=>'
no
');
if ( $GEN->getSelectCount() > 0 ){
my $layer_limits = getLayerLimits(job=>$Job,step=>$Step,layer=>$testlayer,units=>$units,options => '
select
');
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
$GEN->COM("adv_filter_reset");
$GEN->COM("reset_filter_criteria,filter_name=ref_select,criteria=all");
$GEN->COM("sel_ref_feat,layers=,use=select,mode=touch,pads_as=shape,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,include_syms=,exclude_syms=");
if ( $GEN->getSelectCount() > 0 ){
$GEN->selTransform(mode=>'
anchor
',oper=>'
scale
',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$info{text_x},y_scale=>$info{text_y});
}
}
else {
last;
}
$index++;
}
#$GEN->COM('
truncate_layer
', layer =>$testlayer);
$default_layer = $curlayer;
$GEN->COM('
disp_on
');
$GEN->workLayer(name=>$curlayer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2) if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
update_loading("请确认$curlayer 文字放大结果并制作到正式文字层...",0,position=>'
n
');
$ans = $GEN->PAUSE('
Please
Check
');
return '
Cancel
' unless $ans eq '
OK
';
#$GEN->COM('
truncate_layer
', layer =>$curlayer);
$GEN->deleteLayer(job=>$Job,layer=>[$ref_layer]);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'
all
',affected=>'
no
' );
if( $GEN->{STATUS} ){
$GUI->msgbox(-icon=>'
error
',-text=>join("\n",@{$GEN->{STATUS}}));
return '
Error
';
}
$GEN->units(type=>$units);
}
return undef;
}
sub enlarge_text_single{
my %par = @_;
my $default_layer = $par{default_layer};
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
while(1){
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$default_layer = undef;
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Set
Work
Layer
');
return '
Cancel
' unless $ans eq '
OK
';
}
}
#$ref_layer = $work_layer.'
_tl
+++
';
$GEN->displayLayer(name=>$ref_layer,number=>2)if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
update_loading("请选择需按当前比例放大的字符,不需制作了请【左键框选空白处】",0,position=>'
n
');
my %tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select! Scale x:$info{text_x} y:$info{text_y}");
$work_layer = $GEN->getWorkLayer();
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'
warning
',-text=>'
没有设定工作层,程序无法继续下去!
');
return '
Cancel
';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$tmp1,invert=>'
no
');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',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->selMoveOther(target_layer=>$tmp1,invert=>'
no
');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',invert=>'
no
');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2) if( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer));
$default_layer = $GEN->getWorkLayer();
last;
}
}
$GEN->COM('
disp_off
');
$GEN->units( type=>$units );
##获取涨缩信息
$GEN->affectedLayer(affected=>'
yes
',layer=>[$tmp1],clear_before=>'
yes
');
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$tmp1,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley) = ($info{text_x},$info{text_y});
##
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'
yes
');
$GEN->selTransform(mode=>'
anchor
',oper=>'
scale
',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley);
$GEN->selMoveOther(target_layer=>$work_layer,invert=>'
no
');
$default_layer = $work_layer;
$GEN->COM('
truncate_layer
', layer =>$tmp1);
$GEN->COM('
disp_on
');
if( $GEN->{STATUS} ){
$GEN->COM('
disp_on
');
$GUI->msgbox(-icon=>'
error
',-text=>join("\n",@{$GEN->{STATUS}}));
return '
Error
';
}
$GEN->units(type=>$units);
}
return $default_layer;
}
####GEN lib no options 属性
sub getLayerLimits {
my %par = @_;
$par{units} = '
inch
' if (! defined $par{units});
my %return;
$GEN->INFO(
'
units
'=>$par{units},
'
entity_type
'=>'
layer
',
'
entity_path
'=>"$par{job}/$par{step}/$par{layer}",
'
data_type
'=>'
limits
',
'
options
'
=>
$par
{
options
}
);
$return
{
xmin
}
=
$GEN
->
{
doinfo
}{
gLIMITSxmin
};
$return
{
ymin
}
=
$GEN
->
{
doinfo
}{
gLIMITSymin
};
$return
{
xmax
}
=
$GEN
->
{
doinfo
}{
gLIMITSxmax
};
$return
{
ymax
}
=
$GEN
->
{
doinfo
}{
gLIMITSymax
};
$return
{
xsize
}
=
$return
{
xmax
}
-
$return
{
xmin
};
$return
{
ysize
}
=
$return
{
ymax
}
-
$return
{
ymin
};
if
(
wantarray
){
return
%
return
;
}
else
{
return
{
%
return
};
}
}
__END__
public_script/字符优化/sl_separate.pl
0 → 100644
View file @
f4212ebf
=head
NAME:
DESCRIPTION:
PARAMETER:
[
{
name : 'step_filter',
title : '工作step',
type : 'LineEdit',
property : {tool_tip : '过滤Step名称'},
},
{
name : 'units',
title : '单位',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'inch',text:'INCH'},
{name:'mm',text:'MM'},
],
tool_tip:'工作单位,未设定,默认为INCH'
},
pack : {row:1,column:1},
},
{
name : 'cover_layer_suffix',
title : '文字套层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'silk_suffix',
title : '分离的文字层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'text_height',
title : '文字最大高度',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'select_lyr',
title : '选择层别',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'未设定,默认为Yes'
},
pack : {row:1,column:1},
},
{
name : 'bk_suffix',
title : '备份层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2019-05-24 Shyer
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> </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
,
$Step
)
=
(
$JOB
,
undef
);
$PAR
->
{
units
}
=
'inch'
unless
$PAR
->
{
units
};
$PAR
->
{
del_backup
}
=
'no'
unless
$PAR
->
{
del_backup
};
$PAR
->
{
save_job
}
=
'no'
unless
$PAR
->
{
save_job
};
$PAR
->
{
select_lyr
}
=
'yes'
unless
(
$PAR
->
{
select_lyr
});
$PAR
->
{
cover_layer_suffix
}
=
'_cover_tl+'
unless
(
$PAR
->
{
cover_layer_suffix
});
unless
(
$PAR
->
{
outline_size
}){
$PAR
->
{
outline_size
}
=
$PAR
->
{
units
}
eq
'inch'
?
16
:
200
;
}
unless
(
$PAR
->
{
text_height
}){
$PAR
->
{
text_height
}
=
$PAR
->
{
units
}
eq
'inch'
?
0.06
:
1.524
;
}
$PAR
->
{
cover_layer_suffix
}
=
'_cover_tl+'
unless
(
$PAR
->
{
cover_layer_suffix
});
doScript
(
"SHT_FUC"
);
my
%
matrix
;
try
{
show_loading
(
"判断是否选择料号.."
,
0
,
position
=>
'n'
);
unless
(
$Job
){
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
"请先选择料号后再执行脚本!"
);
return
'Cancel'
;
}
##
update_loading
(
"检查料号${Job}是否存在 ,请稍候.."
,
0
,
position
=>
'n'
);
unless
(
$GEN
->
isJobExists
(
job
=>
$Job
)
){
$GUI
->
msgbox(-icon=>'error',-text=>"料号 ${Job} 在Genesis
中不存在
,
请检查
!
");
return 'Error';
}
##
update_loading("
正在打开料号
$
{
Job
}
,请稍候
..
",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
##
update_loading("
过滤工作
step
...
",0,position=>'n');
my $ans_step = get_work_step();
return 'Cancel' if $ans_step eq 'Cancel';
##
update_loading("
过滤层别
...
",0,position=>'n');
my @work_layers = get_work_layer();
return 'Cancel' if $work_layers[0] eq 'Cancel';
my %info = $GUI->show_form(
-title => '请手动匹配以下信息',
-showcheck => 1,-gen=>$GEN,
-defaultsize=>[500,250],
-items=>[
{
name=>'type',
type=>'radio',
label=>'类型',
value=>'separate',
property=>{
tl_columns => 2,
tl_list => [separate => '字框分离', change=>'字框切换'],
},
validate_func=>sub{
my %par = @_;
return {} if($par{mode} eq 'save');
if ($par{value} eq 'separate') {
$par{formpanel}->set_item_visible(text_height=>1);
}else{
$par{formpanel}->set_item_visible(text_height=>0);
}
return {};
}
},
{
name => 'text_height',
label => '文字最大高度',
type => 'number',
value=>$PAR->{text_height}*1000,
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
]
);
return 'Cancel' unless %info;
#
###
update_loading("
打开
$
{
Step
}
,请稍候
..
",0,position=>'n');
$GEN->openStep(job=>$Job,name=>$Step);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->units( type=>$PAR->{units} );
$GEN->zoomHome();
my $layer_count = $IKM->get_jobinfo(-jobname=>$Job,
-jobcategory=>'work',
-jobinfo=>'layer_count');
$GEN->COM('disp_off');
if ($info{type} eq 'separate') {
foreach my $layer (@work_layers) {
update_loading("
正在
$layer
制作分离文字
,请稍候
..
",0,position=>'n');
##备份文字层
my $bk = $layer.$PAR->{bk_suffix};
$GEN->copyLayer(source_job=>$Job,
source_step=>$Step,
source_layer=>$layer,
dest_layer=>$bk,
mode=>'replace', #append/replace
invert=>'no') ;#|'yes'
##分离出的文字层
my $ss_text = $layer.$PAR->{silk_suffix};
if ($matrix{$layer}{side} eq 'top') {
$GEN->createLayer(job=>$Job,layer=>$ss_text,context=>'board',type=>'document',before=>$layer,delete_exists=>'yes');
}else{
$GEN->createLayer(job=>$Job,layer=>$ss_text,context=>'board',type=>'document',after=>$layer,delete_exists=>'yes');
}
##开始分离文字
$GEN->affectedLayer(affected=>'yes',layer=>[$layer],clear_before=>'yes');
#$GEN->COM("
filter_reset
,
filter_name
=
popup
");
#$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
$GEN->COM("
filter_reset
,
filter_name
=
popup
");
$GEN->selectByFilter(
feat_types=>'line\;arc',
polarity=>'positive',
profile=>'all',
);
if ( $GEN->getSelectCount() > 0 ){
my $ss_line_arc = $layer.'_line_arc_tl_script';
$GEN->createLayer(job=>$Job,layer=>$ss_line_arc,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$ss_line_arc,invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$ss_line_arc],clear_before=>'yes');
$GEN->selChangeSym(symbol=>'r0.2');
#$GEN->COM('filter_reset',filter_name=>'popup');
#$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
$GEN->COM("
filter_reset
,
filter_name
=
popup
");
$GEN->selectByFilter(
feat_types=>'line',
polarity=>'positive',
profile=>'all',
);
##将直线固定角度分离去除
my $ss_line = $layer.'_line_tl_script';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$ss_line,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$ss_line,invert=>'no');
$GEN->affectedLayer(affected=>'yes',layer=>[$ss_line],clear_before=>'yes');
$GEN->COM("
filter_reset
,
filter_name
=
popup
");
my @angle;
my $tol = 0.2;
if($GEN->{GEN_TYPE} eq 'genesis'){
@angle = (-180,-135,-90,-45,0,45,90,135);
}else{
@angle = (0,45,90,135,180,225,270,315);
}
foreach my $angle (@angle) {
if($GEN->{GEN_TYPE} eq 'genesis'){
my $min_angle = ($angle-$tol < -180) ? -180 : $angle-$tol;
my $max_angle = ($angle+$tol > 180) ? 180 : $angle+$tol;
$GEN->COM('filter_set',filter_name=>'popup',update_popup=>'yes',slot=>'line',slot_by=>'angle',min_angle=>$min_angle,max_angle=>$max_angle);
}else{
$GEN->COM('set_filter_angle',direction=>'ccw',max_angle=>$angle+$tol,min_angle=>$angle-$tol,slot=>'lines');
$GEN->COM("
adv_filter_set
,
ccw_rotations
=
,
filter_name
=
popup
,
mirror=any,bound_box=no,active=yes,srf_values=no,srf_area=no,limi
t_box
=
no
");
}
$GEN->COM("
filter_area_strt
");
$GEN->COM("
filter_area_end
,
filter_name
=
popup
,
operation
=
select
");
}
$GEN->selDelete() if ( $GEN->getSelectCount() > 0 );
}
next if(!($GEN->isLayerExists(job=>$Job,layer=>$ss_line) and (!$GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ss_line))));
###利用制作的套层
my $cover_lyr = $layer.$PAR->{cover_layer_suffix};
$GEN->affectedLayer(affected=>'yes',layer=>[$cover_lyr],clear_before=>'yes');
$GEN->COM("
filter_reset
,
filter_name
=
popup
");
$GEN->COM("
filter_set
,
filter_name
=
popup
,
update_popup
=
no
,
include_syms
=
r
*
");
$GEN->COM("
filter_set
,
filter_name
=
popup
,
update_popup
=
no
,
exclude_syms
=
rect
*
");
$GEN->COM("
filter_area_strt
");
$GEN->COM("
filter_area_end
,
filter_name
=
popup
,
layer
=
,
operation
=
select
,
inside_area
=
no
,
intersect_area
=
no
,
area_type
=
none
");
$GEN->COM("
filter_reset
,
filter_name
=
popup
");
$GEN->COM("
sel_reverse
");
my $cover_lyr_2 = $cover_lyr.'_tmp_tl';
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();
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
}else{
$GEN->COM("
filter_atr_reset
,
filter_name
=
ref_select
");
}
$GEN->COM("
sel_ref_feat
,
pads_as
=
shape
,
mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=posi
tive
\
;
negative
,
layers
=
$ss_line
");
my $layer_tmp1 = $layer.'_tmp1_tl';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$layer_tmp1,delete_exists=>'yes');
$GEN->selMoveOther(target_layer=>$layer_tmp1,invert=>'no');
}
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
}else{
$GEN->COM("
filter_atr_reset
,
filter_name
=
ref_select
");
}
$GEN->COM("
sel_ref_feat
,
pads_as
=
shape
,
mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=positive\;negative,layers=$co
ver_lyr_2
");
my $layer_tmp2 = $layer.'_tmp2_tl';
if ( $GEN->getSelectCount() > 0 ){
$GEN->createLayer(job=>$Job,layer=>$layer_tmp2,delete_exists=>'yes');
$GEN->selCopyOther(target_layer=>$layer_tmp2,invert=>'no');
}
$GEN->COM("
sel_clean_surface
,
max_fold_len=0,clean_size=$info{text_height},clean_mode=x_and_y,accurac
y
=
0
");
if ($GEN->isLayerExists(job=>$Job,layer=>"
$layer_tmp2
")) {
$GEN->affectedLayer(affected=>'yes',layer=>[$layer_tmp2],clear_before=>'yes');
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
}else{
$GEN->COM("
filter_atr_reset
,
filter_name
=
ref_select
");
}
$GEN->COM("
sel_ref_feat
,
pads_as
=
shape
,
mode=disjoint,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=posi
tive
\
;
negative
,
layers
=
$ss_line_arc
");
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$layer_tmp1,invert=>'no');
}
}
if ($GEN->isLayerExists(job=>$Job,layer=>"
$layer_tmp1
")) {
$GEN->affectedLayer(affected=>'yes',layer=>[$layer_tmp1],clear_before=>'yes');
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
}else{
$GEN->COM("
filter_atr_reset
,
filter_name
=
ref_select
");
}
$GEN->COM("
sel_ref_feat
,
pads_as
=
shape
,
mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,pola
rity
=
negative
,
layers
=
$layer
");
$GEN->selDelete() if ( $GEN->getSelectCount() > 0 );
$GEN->affectedLayer(affected=>'yes',layer=>[$layer],clear_before=>'yes');
if($GEN->{GEN_TYPE} eq 'incam'){
$GEN->COM("
reset_filter_criteria
,
filter_name
=
,
criteria
=
all
");
}else{
$GEN->COM("
filter_atr_reset
,
filter_name
=
ref_select
");
}
$GEN->COM("
sel_ref_feat
,
pads_as
=
shape
,
mode=touch,exclude_syms=,include_syms=,use=filter,f_types=line\;pad\;surface\;arc\;text,polarity=posi
tive
\
;
negative
,
layers
=
$layer_tmp1
");
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$ss_text,invert=>'no');
}
}
##将文字属性挑选
$GEN->COM("
filter_reset
,
filter_name
=
popup
");
$GEN->selectByFilter(
feat_types=>'text',
);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$ss_text,invert=>'no');
}
_deleteLayer(layer=>[$ss_line_arc,$ss_line,$cover_lyr_2,$layer_tmp1,$layer_tmp2]);
}
}
}
$GEN->COM('disp_on');
##字框切换 ## @work_layers
my $work_layer;
my $ref_layer;
my $flag = 0;
foreach my $layer (@work_layers) {
$work_layer = $layer;
$ref_layer = $layer.$PAR->{silk_suffix};
if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) ){
$flag = 1;
last;
}
}
if ($flag) {
$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};
}elsif(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) ){
$GUI->msgbox(-icon=>'warning',-text=>"
没有找到对应层
$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');
my %tmp_con;
%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};
}elsif(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) ){
$GUI->msgbox(-icon=>'warning',-text=>"
没有找到对应层
$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->COM("
filter_reset
,
filter_name
=
popup
");
$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{
$GUI->msgbox(-icon=>'info',-title=>'标题',-text=>"
没有找到文字框和对应的文字层,程序将退出。
");
return 'Cancel';
}
$GEN->workLayer(name=>$work_layers[0],display_number=>1,clear_before=>'yes');
$GEN->displayLayer(name=>$work_layers[0].$PAR->{silk_suffix},number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$work_layers[0].$PAR->{silk_suffix}) );
$GEN->COM('sel_clear_feat');
#$GEN->clearLayers();
#$GEN->affectedLayer( mode=>'all',affected=>'no' );
update_loading("
程序运行完成,请检查运行结果
..
",0,position=>'n');
sleep(2);
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("
$Job
正在保存料号,请稍候
...
",0,position=>'n');
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->saveJob(job=>$Job);
hide_loading();
}
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
{
};
######################################################################################
sub
get_work_step
{
my
@steps
=
$GEN
->
getStepList
(
job
=>
$Job
);
if
(
@steps
==
0
)
{
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
'在料号中没有Step存在,你将退出!'
);
return
'Cancel'
;
}
elsif
(
@steps
!=
0
){
my
@tmp_steps
=
grep
(
/$PAR->{step_filter}/
,
@steps
);
if
(
@tmp_steps
==
0
)
{
$GUI
->
msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的s
tep
不存在,请检查资料或者脚本参数配置!
');
return '
Cancel
';
}
elsif (@tmp_steps == 1) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'
请选择工作
Step
',
-steplist=>[@tmp_steps],
-default=>[$tmp_steps[0]],
-gen=>$GEN,
-selectmode=>'
single
');
return '
Cancel
' unless ($Step);
}
}
return undef;
}
sub isChecklistExist{
my %par = @_ ;
my @chklists = $GEN->getChecklist(job=>$par{job},step=>$par{step});
if(grep /^$par{checkklist}$/,@chklists){
return 1;
}
else{
return 0;
}
}
sub get_work_layer{
my @work_layers;
# 获取工作层
%matrix = $GEN->getMatrix(job=>$Job,type=>'
hash
');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq '
board
' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq '
silk_screen
' ){
push @work_layers,$layer;
}
}
}
#
my %tmp_matrix;
foreach my $layer (@work_layers) {
$tmp_matrix{$layer} = $matrix{$layer};
}
##
if (@work_layers > 1 and $PAR->{select_lyr} eq '
yes
') {
@work_layers = $GUI->select_layer(
-title=>'
请选择工作层别
',
-layermatrix=>\%tmp_matrix,
-selectmode => '
multiple
');#single
return '
Cancel
'
unless
(
@work_layers
);
}
else
{
@work_layers
=
@work_layers
;
}
return
@work_layers
;
}
sub
_deleteLayer
{
my
%
par
=
@_
;
foreach
my
$layer
(
@
{
$par
{
layer
}}){
$GEN
->
deleteLayer
(
layer
=>
$layer
)
if
(
$GEN
->
isLayerExists
(
job
=>
$Job
,
layer
=>
$layer
));
}
}
__END__
public_script/字符优化/创建套层.pl
0 → 100644
View file @
f4212ebf
=head
NAME:
DESCRIPTION:
PARAMETER:
[
{
name : 'step_filter',
title : '工作step',
type : 'LineEdit',
property : {tool_tip : '过滤Step名称'},
},
{
name : 'units',
title : '单位',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'inch',text:'INCH'},
{name:'mm',text:'MM'},
],
tool_tip:'工作单位,未设定,默认为INCH'
},
pack : {row:1,column:1},
},
{
name : 'cover_layer_suffix',
title : '文字套层后缀',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_sm',
title : '文字距离阻焊',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_smd',
title : '文字距离SMD',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'ss_to_bga',
title : '文字距离bga',
type : 'LineEdit',
property : {tool_tip : ''},
},
{
name : 'select_lyr',
title : '选择层别',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'未设定,默认为Yes'
},
pack : {row:1,column:1},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2019-05-24 Shyer
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> </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
,
$Step
)
=
(
$JOB
,
undef
);
$PAR
->
{
units
}
=
'inch'
unless
$PAR
->
{
units
};
$PAR
->
{
del_backup
}
=
'no'
unless
$PAR
->
{
del_backup
};
$PAR
->
{
save_job
}
=
'no'
unless
$PAR
->
{
save_job
};
$PAR
->
{
select_lyr
}
=
'yes'
unless
(
$PAR
->
{
select_lyr
});
$PAR
->
{
cover_layer_suffix
}
=
'_cover_tl+'
unless
(
$PAR
->
{
cover_layer_suffix
});
unless
(
$PAR
->
{
outline_size
}){
$PAR
->
{
outline_size
}
=
$PAR
->
{
units
}
eq
'inch'
?
16
:
200
;
}
my
$outline
=
'gko'
;
my
%
matrix
;
try
{
show_loading
(
"判断是否选择料号.."
,
0
,
position
=>
'n'
);
unless
(
$Job
){
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
"请先选择料号后再执行脚本!"
);
return
'Cancel'
;
}
##
update_loading
(
"检查料号${Job}是否存在 ,请稍候.."
,
0
,
position
=>
'n'
);
unless
(
$GEN
->
isJobExists
(
job
=>
$Job
)
){
$GUI
->
msgbox(-icon=>'error',-text=>"料号 ${Job} 在Genesis
中不存在
,
请检查
!
");
return 'Error';
}
##
update_loading("
正在打开料号
$
{
Job
}
,请稍候
..
",0,position=>'n');
$GEN->openJob(job=>$Job) unless ($GEN->isJobOpen(job=>$Job));
##
update_loading("
过滤工作
step
...
",0,position=>'n');
my $ans_step = get_work_step();
return 'Cancel' if $ans_step eq 'Cancel';
##
update_loading("
过滤层别
...
",0,position=>'n');
my @work_layers = get_work_layer();
return 'Cancel' if $work_layers[0] eq 'Cancel';
my %info = $GUI->show_form(
-title => '请手动匹配以下信息',
-showcheck => 1,-gen=>$GEN,
-defaultsize=>[500,250],
-items=>[
{
name => 'ss_to_sm',
label => '文字距离阻焊(单边)',
type => 'number',
value=>$PAR->{ss_to_sm},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
{
name => 'ss_to_smd',
label => '文字距离SMD(单边)',
type => 'number',
value=>$PAR->{ss_to_smd},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
{
name => 'ss_to_bga',
label => '文字距离BGA(单边)',
type => 'number',
value=>$PAR->{ss_to_bga},
units=>$PAR->{units} eq 'inch' ? 'mil' : 'um',
},
]
);
return 'Cancel' unless %info;
#
###
update_loading("
打开
$
{
Step
}
,请稍候
..
",0,position=>'n');
$GEN->openStep(job=>$Job,name=>$Step);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
$GEN->units( type=>$PAR->{units} );
$GEN->zoomHome();
update_loading("
正在制作文字套层
,请稍候
..
",0,position=>'n');
foreach my $layer (@work_layers) {
my $cover_lyr = $layer.$PAR->{cover_layer_suffix} ;
my ($sm,$outer) ;
if ($matrix{$layer}{side} eq 'top') {
$sm = 'gts';
$outer = 'gtl';
$GEN->createLayer(job=>$Job,layer=>$cover_lyr,context=>'board',type=>'document',before=>$layer,delete_exists=>'yes');
}else{
$sm = 'gbs';
$outer = 'gbl';
$GEN->createLayer(job=>$Job,layer=>$cover_lyr,context=>'board',type=>'document',after=>$layer,delete_exists=>'yes');
}
if ( $GEN->isLayerExists(job=>$Job,layer=>$sm) ) {
$GEN->affectedLayer(affected=>'yes',layer=>[$sm],clear_before=>'yes');
$GEN->selectByFilter(
polarity=>'positive',
profile=>'all',
);
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$cover_lyr,invert=>'no',size=>2*$info{ss_to_sm});
}
if ( $GEN->isLayerExists(job=>$Job,layer=>$outer) ) {
$GEN->affectedLayer(affected=>'yes',layer=>[$outer],clear_before=>'yes');
$GEN->selectByFilter(
attribute=>['.smd'],
profile=>'all',
);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$cover_lyr,invert=>'no',size=>2*$info{ss_to_smd});
}
$GEN->selectByFilter(
attribute=>['.bga'],
profile=>'all',
);
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(dest=>'layer_name',target_layer=>$cover_lyr,invert=>'no',size=>2*$info{ss_to_bga});
}
}
if ( $GEN->isLayerExists(job=>$Job,layer=>$outline) ) {
my $outline_tmp = $outline.'_tmp_tl';
$GEN->copyLayer(source_job=>$Job,
source_step=>$Step,
source_layer=>$outline,
dest_layer=>$outline_tmp,
mode=>'replace', #append/replace
invert=>'no') ;#|'yes'
$GEN->affectedLayer(affected=>'yes',layer=>[$outline_tmp],clear_before=>'yes');
$GEN->selectByFilter(
feat_types=>'line\;arc',
polarity=>'positive',
profile=>'all',
);
$GEN->selChangeSym(symbol=>'r'.$PAR->{outline_size}) if ( $GEN->getSelectCount() > 0 );
$GEN->copyLayer(source_job=>$Job,
source_step=>$Step,
source_layer=>$outline_tmp,
dest_layer=>$cover_lyr,
mode=>'append', #append/replace
invert=>'no') ;#|'yes'
$GEN->deleteLayer(job=>$Job,layer=>[$outline_tmp],step=>$Step);
}
}
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'all',affected=>'no' );
update_loading("
程序运行完成,请检查运行结果
..
",0,position=>'n');
sleep(2);
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("
$Job
正在保存料号,请稍候
...
",0,position=>'n');
$GEN->checkInout(job=>$Job,mode=>'out');
$GEN->saveJob(job=>$Job);
hide_loading();
}
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
{
};
######################################################################################
sub
get_work_step
{
my
@steps
=
$GEN
->
getStepList
(
job
=>
$Job
);
if
(
@steps
==
0
)
{
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
'在料号中没有Step存在,你将退出!'
);
return
'Cancel'
;
}
elsif
(
@steps
!=
0
){
my
@tmp_steps
=
grep
(
/$PAR->{step_filter}/
,
@steps
);
if
(
@tmp_steps
==
0
)
{
$GUI
->
msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的s
tep
不存在,请检查资料或者脚本参数配置!
');
return '
Cancel
';
}
elsif (@tmp_steps == 1) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'
请选择工作
Step
',
-steplist=>[@tmp_steps],
-default=>[$tmp_steps[0]],
-gen=>$GEN,
-selectmode=>'
single
');
return '
Cancel
' unless ($Step);
}
}
return undef;
}
sub isChecklistExist{
my %par = @_ ;
my @chklists = $GEN->getChecklist(job=>$par{job},step=>$par{step});
if(grep /^$par{checkklist}$/,@chklists){
return 1;
}
else{
return 0;
}
}
sub get_work_layer{
my @work_layers;
# 获取工作层
%matrix = $GEN->getMatrix(job=>$Job,type=>'
hash
');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq '
board
' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq '
silk_screen
' ){
push @work_layers,$layer;
}
}
}
#
my %tmp_matrix;
foreach my $layer (@work_layers) {
$tmp_matrix{$layer} = $matrix{$layer};
}
##
if (@work_layers > 1 and $PAR->{select_lyr} eq '
yes
') {
@work_layers = $GUI->select_layer(
-title=>'
请选择工作层别
',
-layermatrix=>\%tmp_matrix,
-selectmode => '
multiple
');#single
return '
Cancel
'
unless
(
@work_layers
);
}
else
{
@work_layers
=
@work_layers
;
}
return
@work_layers
;
}
__END__
public_script/字符优化/字框分离.pl
0 → 100644
View file @
f4212ebf
=head
NAME:
DESCRIPTION: 放大文字框
PARAMETER:
[
{
name : 'step_filter',
title : '工作Step',
type : 'LineEdit',
property:{tool_tip:''}
},
{
name : 'sm_ref',
title : '防焊参考层后缀',
type : 'LineEdit',
property:{tool_tip:'如未设置,则默认为:-ref'},
},
{
name : 'is_select_lyr',
type : 'RadioBox',
title : '是否选择层别',
property : {tool_tip:'未设定,则默认no',
size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'del_backup',
type : 'RadioBox',
title : '删除TL备份层',
property : {tool_tip:'未设定,则默认yes',size_policy:'Expanding,Fixed',item_list:[{name:'yes',text:'Yes'},{name:'no',text:'No'}]},
pack : {row:9,column:1},
},
{
name : 'save_job',
title : '保存料号',
type : 'RadioBox',
property : {
size_policy:'Expanding,Fixed',
item_list:[
{name:'Yes',text:'Yes'},
{name:'No',text:'No'},
],
tool_tip:'脚本结束后自动保存料号,未设定,默认为No'
},
pack : {row:1,column:1},
}
]
VERSION_HISTORY:
V1.00 2019-6-28 Shyer
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>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
=cut
use
strict
;
use
Encode
;
use
utf8
;
use
Data::
Dump
'dump'
;
my
(
$Job
,
$Step
)
=
(
$JOB
,
undef
);
$PAR
->
{
step_filter
}
=
'.*'
unless
$PAR
->
{
step_filter
};
$PAR
->
{
is_select_lyr
}
=
$PAR
->
{
is_select_lyr
}
||
'no'
;
$PAR
->
{
del_backup
}
=
'yes'
unless
$PAR
->
{
del_backup
};
$PAR
->
{
sm_ref
}
=
'-ref'
unless
$PAR
->
{
sm_ref
};
$PAR
->
{
save_job
}
=
'No'
unless
$PAR
->
{
save_job
};
my
$Return
=
'done'
;
my
$units
=
'inch'
;
$PAR
->
{
crate_tmp
}
=
'yes'
unless
$PAR
->
{
crate_tmp
};
$PAR
->
{
tol
}
=
1
;
try
{
##
show_loading
(
"判断是否选择料号.."
,
0
,
position
=>
'n'
);
unless
(
$Job
){
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
"请先选择料号后再执行脚本!"
);
return
'Cancel'
;
}
update_loading
(
"检查${Job}是否存在.."
,
0
,
position
=>
'n'
);
##检查料号是否存在
unless
(
$GEN
->
isJobExists
(
job
=>
$Job
)
){
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
"料号 $Job 不存在,请确认。"
);
return
'Cancel'
;
}
update_loading
(
"正在打开料号$Job..."
,
0
,
position
=>
'n'
);
$GEN
->
openJob
(
job
=>
$Job
)
unless
(
$GEN
->
isJobOpen
(
job
=>
$Job
));
###选择工作step
update_loading
(
"过滤工作step..."
,
0
,
position
=>
'n'
);
my
@steps
=
$GEN
->
getStepList
(
job
=>
$Job
);
if
(
@steps
==
0
)
{
$GUI
->
msgbox
(
-
icon
=>
'error'
,
-
text
=>
'在料号中没有Step存在,你将退出!'
);
return
0
;
}
elsif
(
@steps
!=
1
){
my
@tmp_steps
=
grep
(
/$PAR->{step_filter}/
,
@steps
);
if
(
@tmp_steps
==
0
)
{
$GUI
->
msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的s
tep
不存在,请检查资料或者脚本参数配置!
');
return '
Cancel
';
}
elsif ( @tmp_steps == 1 ) {
$Step = $tmp_steps[0];
}
else {
$Step = $GUI->select_step(-title=>'
请选择工作
Step
',
-steplist=>[@tmp_steps],
-selectmode=>'
single
');
return '
Cancel
' unless ($Step);
}
}
else {
$Step = $steps[0];
}
$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=>$units );
$GEN->zoomHome();
##过滤 board layers
update_loading("过滤工作层...",0,position=>'
n
');
my @work_layers = get_work_layer();
return '
Cancel
' if $work_layers[0] eq '
Cancel
';
##创建辅助层
$PAR->{crate_tmp} = '
no
';
if( $PAR->{crate_tmp} =~ /yes/i ){
update_loading("正在创建文字层对应的防焊参考层,请稍候...",0,position=>'
n
');
foreach my $layer(@work_layers){
my $sm_layer = $layer =~ /gto/ ? '
gts
' : '
gbs
';
my $ref_layer = $layer.$PAR->{sm_ref};
next unless ( $GEN->isLayerExists(job=>$Job,layer=>$sm_layer) );
$GEN->createLayer(job=>$Job,layer=>$ref_layer,context=>'
misc',type=>'document',before=>$layer) unless( $GEN->isLayerExis
ts
(
job
=>
$Job
,
layer
=>
$ref_layer
)
);
$GEN
->
copyLayer
(
source_job
=>
$Job
,
source_step
=>
$Step
,
source_layer
=>
$sm_layer
,
dest_layer
=>
$ref_layer
,
mode=>'replace',invert=>'no
');
$GEN->affectedLayer(affected=>'
yes
',layer=>[$ref_layer],clear_before=>'
yes
');
$GEN->selContourize();
$GEN->COM('
sel_resize
',size=>10,corner_ctl=>'
no
');
}
}
foreach my $layer(@work_layers){
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$layer,dest_layer=>$layer.'
_tl
+++
',mode=>'
replace
',invert=>'
no
');
}
# 开始放大文字框
my $default_layer = $work_layers[0];
my $ref_layer = $default_layer.$PAR->{sm_ref};
##
my ($tmp1,$tmp2) = ('
tl_script_tmp1
','
tl_script_tmp2
');
##
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
$GEN->workLayer(name=>$default_layer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2);
my %info;
$info{type} = '
silk_frame
';
$info{scale_type} = '
scale
';
$info{x} = $info{y} = 1.05;
$info{text_x} = $info{text_y} = 1.05;
$info{text_space} = 10;
$default_layer = enlarge_slik_frame(default_layer=>$default_layer,ref_layer=>$ref_layer,info=>\%info,tmp1=>$tmp1,tmp2=>$tmp2);
return $default_layer if $default_layer eq '
Cancel
';
$GEN->deleteLayer(job=>$Job,layer=>[$tmp1,$tmp2],step=>$Step);
if ($PAR->{del_backup} eq '
yes
'){
foreach my $layer(@work_layers){
$GEN->deleteLayer(job=>$Job,layer=>[$layer.'
_tl
+++
']) ;
}
}
$GEN->COM( "sel_single_feat,operation=select,x=-10,y=-10,cyclic=no ");
$GEN->affectedLayer(mode=>'
all
',affected=>'
no
');
update_loading("【 放大文字框 】完成..",1,position=>'
n
');
hide_loading();
##保存料号
if( $PAR->{save_job} =~ /yes/i ){
show_loading("$Job 正在保存料号,请稍候...",0,position=>'
n
');
$GEN->checkInout(job=>$Job,mode=>'
out
');
$GEN->saveJob(job=>$Job);
hide_loading();
}
unless ($GEN->{STATUS}){
return $Return;
}
else{
$GEN->COM('
disp_on
');
$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 = shift;
$GEN->COM('
disp_on
');
$GUI->msgbox(-icon=>'
error
',-text=>$error);
return '
Error
';
}
finally{
$GEN->COM('
disp_on
');
};
sub get_work_layer{
my %par = @_;
update_loading("过滤层别...",0,position=>'
n
');
my @silk;
# 获取工作层
my %matrix = $GEN->getMatrix(job=>$Job,type=>'
hash
');
foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) {
if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq '
board
' ){
if(defined($matrix{$layer}{tl_type}) and $matrix{$layer}{tl_type} eq '
silk_screen
' ){
push @silk,$layer;
}
}
}
unless( @silk ){
$GUI->msgbox(-icon=>'
warning
',-text=>'
资料中无文字层,请确认
');
return '
Cancel
';
}
if ($PAR->{is_select_lyr} eq '
yes
' and scalar @silk > 1) {
my (%tmp_matrix);
foreach my $layer (@silk) {
$tmp_matrix{$layer} = $matrix{$layer};
}
@silk = $GUI->select_layer(
-title=>'
请选择工作层别
',
-layermatrix=>\%tmp_matrix,
-selectmode => '
multiple
');#single
return '
Cancel
' unless(@silk);
}
return @silk;
}
sub enlarge_slik_frame{
my %par = @_;
my $default_layer = $par{default_layer};
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
my $ref_pad = '
tmp_ref_pad
';
unless ( $GEN->isLayerExists(job=>$Job,layer=>$ref_pad) ) {
$GEN->createLayer(job=>$Job,layer=>$ref_pad,context=>'
misc
',type=>'
document
');
}
while(1){
#$GEN->affectedLayer(affected=>'
yes
',layer=>[$tmp1,$tmp2],clear_before=>'
yes
');
#$GEN->selDelete();
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Set
Work
Layer
');
return '
Cancel
' unless $ans eq '
OK
';
}
}
$ref_layer = $work_layer.$PAR->{sm_ref};
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
update_loading("请选择需放大的文字框,不需制作了请【左键框选空白处】",0,position=>'
n
');
my %tmp_con;
#if($info{scale_type} eq '
scale
'){
# %tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select! Scale x:$info{x} y:$info{y}");
#}
#else{
# %tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select! Space x:$info{value_x} mil y:$info{value_y} mil");
#}
%tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select");
$GEN->COM('
disp_off
');
$work_layer = $GEN->getWorkLayer();
$ref_layer = $work_layer.$PAR->{sm_ref};
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'
warning
',-text=>'
没有设定工作层,程序无法继续下去!
');
return '
Cancel
';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$tmp1,invert=>'
no
');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',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->selCopyOther(target_layer=>$tmp1,invert=>'
no
');
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',invert=>'
no
');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2)if ( $GEN->isLayerExists(job=>$Job,layer=>$ref_layer) );
$default_layer = $GEN->getWorkLayer();
last;
}
}
#$GEN->COM('
disp_off
');
$GEN->units( type=>$units );
##获取涨缩信息
my $text_tmp = '
tl_tmp_text
';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$text_tmp,mode=>'
replace
',invert=>'
no
');
#$GEN->affectedLayer(affected=>'
yes
',layer=>[$text_tmp],clear_before=>'
yes
');
#$GEN->selectByFilter(feat_types=>'
line
\
;
arc
',polarity=>'
positive
',profile=>'
all
');
#$GEN->COM('
sel_change_sym
', symbol => '
r0
')if ( $GEN->getSelectCount() > 0 );
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$text_tmp,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley);
#if( $info{scale_type} eq '
scale
' ){
# $scalex = $info{x};
# $scaley = $info{y};
#}
#else{
# #my $new_limits;
# #$new_limits->{xsize} = $layer_limits->{xsize}+($info{value_x}/1000)*2;
# #$new_limits->{ysize} = $layer_limits->{ysize}+($info{value_y}/1000)*2;
# #$scalex = $new_limits->{xsize}/$layer_limits->{xsize};
# #$scaley = $new_limits->{ysize}/$layer_limits->{ysize};
# $scalex = 1 + ($info{value_x}*2)/($layer_limits->{xsize}*1000);
# $scaley = 1 + ($info{value_y}*2)/($layer_limits->{ysize}*1000);
#}
##自动计算放大比例
unless ( $GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ref_pad) ){
$GEN->affectedLayer(affected=>'
yes
',layer=>[$ref_pad],clear_before=>'
yes
');
$GEN->selDelete();
}
#filter_area_strt (1)
#filter_area_xy,x=0.6067275591,y=3.6900447835 (1)
#filter_area_xy,x=0.6735154528,y=3.6237707677 (1)
#filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=yes (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});
#$GEN->selectByFilter(area_rect=>{x1=>0,y1=>0,x2=>10,y2=>10});
if ( $GEN->getSelectCount() > 0 ){
$GEN->selCopyOther(target_layer=>$ref_pad,invert=>'
no
');
my $layer_limits_pad = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$ref_pad,units=>$units);
my @feature = $GEN->getFeatures(job=>$Job,step=>$Step,layer=>$tmp1,units=>$units);
my $line_width = $feature[0]->{symbol};
$line_width =~ s/^r//;
$line_width = $line_width/1000;
$scalex = ($layer_limits_pad->{xsize}+$line_width*2+0.004)/($layer_limits->{xsize});
$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));
}
#else{
# next;
#}
##
$GEN->deleteLayer(job=>$Job,layer=>[$text_tmp]);
##
$GEN->affectedLayer(affected=>'
yes
',layer=>[$tmp1],clear_before=>'
yes
');
$GEN->selTransform(mode=>'
anchor
',oper=>'
scale
',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley) if(!$GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ref_pad));
check_alone_feature_and_chage(layer=>$tmp1,sacle_x=>$scalex,sacle_y=>$scalex);
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$work_layer,number=>2);
$GEN->displayLayer(name=>$ref_layer,number=>3)if(!$GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$ref_pad));
$GEN->COM('
disp_on
');
update_loading("请确认扩大后文字框是否符合要求(文字框未碰到防焊时,文字框无变化)",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Check
...
');
return '
Cancel
' unless $ans eq '
OK
';
$GEN->COM('
disp_off
');
my $tmp_symbol = '
tl_script_tmp
';
#$GEN->COM( "delete_entity,job=$Job,type=symbol,name=$tmp_symbol" ) if( $GEN->isSymbolExists(job=>$Job,symbol=>$tmp_symbol) );
$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);
$GEN->selBreak()if ( $GEN->getSelectCount() > 0 );
$GEN->COM('
disp_on
');
$default_layer = $GEN->getWorkLayer();
$GEN->COM('
truncate_layer
', layer =>$tmp1);
$GEN->COM('
truncate_layer
', layer =>$tmp2);
$GEN->COM('
disp_on
');
$GEN->COM('
sel_clear_feat
');
if( $GEN->{STATUS} ){
#$GEN->COM('
disp_on
');
$GUI->msgbox(-icon=>'
error
',-text=>join("\n",@{$GEN->{STATUS}}));
return '
Error
';
}
$GEN->units(type=>$units);
}
$GEN->deleteLayer(job=>$Job,layer=>[$ref_pad]);
return $default_layer;
}
sub enlarge_slik_layer{
my %par = @_;
my $default_layer = $par{default_layer};
my %info = %{$par{info}};
my ($curlayer,$testlayer) = ($par{tmp1},$par{tmp2});
while(1){
update_loading("请将需要放大的文字move到一个辅助层上并设为工作层...",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Set
Layer
');
return '
Cancel
' unless $ans eq '
OK
';
$curlayer = $GEN->getWorkLayer();
last unless $curlayer;
unless ( $GEN->isLayerEmpty( job=>$Job,step=>$Step,layer=>$curlayer) ){
$GEN->affectedLayer(affected=>'
yes
',layer=>[$curlayer],clear_before=>'
yes
');
$GEN->selCopyOther(target_layer=>$testlayer,invert=>'
no
',size=>$info{text_space});
}
else{
last;
}
update_loading("正在放大$curlayer 层上字符,请稍候...",0,position=>'
n
');
my $ref_layer = '
tl_silk_layer
';
$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$curlayer,dest_layer=>$ref_layer,mode=>'
replace
',invert=>'
no
');
$GEN->COM('
disp_off
');
$GEN->units( type=>$units );
my $testlayer1 = '
tl_tmp_text
';
$GEN->deleteLayer(job=>$Job,layer=>[$testlayer1]);
##获取涨缩信息
my @feature = $GEN->getFeatures(job=>$Job,step=>$Step,layer=>$testlayer,units=>$units);
foreach my $feat(@feature){
$GEN->affectedLayer(affected=>'
yes
',layer=>[$testlayer],clear_before=>'
yes
');
$GEN->COM('
sel_net_feat
', operation => '
select
',x=>$feat->{xs},y=>$feat->{ys},tol=> '
2.2
');
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$testlayer1,invert=>'
no
');
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$testlayer1,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
$GEN->affectedLayer(affected=>'
yes
',layer=>[$curlayer],clear_before=>'
yes
');
$GEN->selRefFeat(layers=>$testlayer1,use=>'
filter
',mode=>'
touch
');
if ( $GEN->getSelectCount() > 0 ){
$GEN->selTransform(mode=>'
anchor
',oper=>'
scale
',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$info{text_x},y_scale=>$info{text_y});
}
$GEN->COM('
truncate_layer
', layer =>$testlayer1);
}
}
$GEN->COM('
truncate_layer
', layer =>$testlayer);
$GEN->deleteLayer(job=>$Job,layer=>[$testlayer1]);
$default_layer = $curlayer;
$GEN->COM('
disp_on
');
$GEN->workLayer(name=>$curlayer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2);
update_loading("请确认$curlayer 文字放大结果并制作到正式文字层...",0,position=>'
n
');
$ans = $GEN->PAUSE('
Please
Check
');
return '
Cancel
' unless $ans eq '
OK
';
#$GEN->COM('
truncate_layer
', layer =>$curlayer);
$GEN->deleteLayer(job=>$Job,layer=>[$ref_layer]);
$GEN->clearLayers();
$GEN->affectedLayer( mode=>'
all
',affected=>'
no
' );
if( $GEN->{STATUS} ){
$GUI->msgbox(-icon=>'
error
',-text=>join("\n",@{$GEN->{STATUS}}));
return '
Error
';
}
$GEN->units(type=>$units);
}
return undef;
}
sub enlarge_text_single{
my %par = @_;
my $default_layer = $par{default_layer};
my $ref_layer = $par{ref_layer};
my %info = %{$par{info}};
my ($tmp1,$tmp2) = ($par{tmp1},$par{tmp2});
while(1){
my $work_layer;
if( $default_layer ){
$work_layer = $default_layer;
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$default_layer = undef;
}
else{
while(1){
$work_layer = $GEN->getWorkLayer();
last if $work_layer;
update_loading("请选择一个文字层设为工作层",0,position=>'
n
');
my $ans = $GEN->PAUSE('
Please
Set
Work
Layer
');
return '
Cancel
' unless $ans eq '
OK
';
}
}
$ref_layer = $work_layer.'
_tl
+++
';
$GEN->displayLayer(name=>$ref_layer,number=>2);
update_loading("请选择需按当前比例放大的字符,不需制作了请【左键框选空白处】",0,position=>'
n
');
my %tmp_con = $GEN->MOUSE(type=>'
r
',text=>"Please Select! Scale x:$info{text_x} y:$info{text_y}");
$work_layer = $GEN->getWorkLayer();
unless( defined $work_layer ){
$GUI->msgbox(-icon=>'
warning
',-text=>'
没有设定工作层,程序无法继续下去!
');
return '
Cancel
';
}
if ( $GEN->getSelectCount() > 0 ){
$GEN->selMoveOther(target_layer=>$tmp1,invert=>'
no
');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',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->selMoveOther(target_layer=>$tmp1,invert=>'
no
');
#$GEN->copyLayer(source_job=>$Job,source_step=>$Step,source_layer=>$tmp1,dest_layer=>$tmp2,mode=>'
replace
',invert=>'
no
');
}
else{
$GEN->workLayer(name=>$work_layer,display_number=>1,clear_before=>'
yes
');
$GEN->displayLayer(name=>$ref_layer,number=>2);
$default_layer = $GEN->getWorkLayer();
last;
}
}
$GEN->COM('
disp_off
');
$GEN->units( type=>$units );
##获取涨缩信息
$GEN->affectedLayer(affected=>'
yes
',layer=>[$tmp1],clear_before=>'
yes
');
my $layer_limits = $GEN->getLayerLimits(job=>$Job,step=>$Step,layer=>$tmp1,units=>$units);
$layer_limits->{xc} = $layer_limits->{xmin}+$layer_limits->{xsize}/2;
$layer_limits->{yc} = $layer_limits->{ymin}+$layer_limits->{ysize}/2;
my ($scalex,$scaley) = ($info{text_x},$info{text_y});
##
$GEN->workLayer(name=>$tmp1,display_number=>1,clear_before=>'
yes
');
$GEN->selTransform(mode=>'
anchor
',oper=>'
scale
',x_anchor=>$layer_limits->{xc},y_anchor=>$layer_limits->{yc},x_scale=>$scalex,y_scale=>$scaley);
$GEN->selMoveOther(target_layer=>$work_layer,invert=>'
no
');
$default_layer = $work_layer;
$GEN->COM('
truncate_layer
', layer =>$tmp1);
$GEN->COM('
disp_on
');
if( $GEN->{STATUS} ){
$GEN->COM('
disp_on
');
$GUI->msgbox(-icon=>'
error
',-text=>join("\n",@{$GEN->{STATUS}}));
return '
Error
';
}
$GEN->units(type=>$units);
}
return $default_layer;
}
sub check_alone_feature_and_chage{
#检查是否含单根线
my %tmp = @_;
my $layer = $tmp{layer};
my $tmp = '
tl
-
'.$layer.'
tmp1
++
';
my $tmp2 = '
tl
-
'.$layer.'
tmp2
++
';
my $tmp3 = '
tl
-
'.$layer.'
-
alone
';
my $cale_x = $tmp{sacle_x}||1;
my $cale_y = $tmp{sacle_y}||1;
$GEN->createLayer(job=>$Job,layer=>$tmp,context=>'
misc',type=>'document',delete_exis
ts
=>
'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_befo
re
=>
'yes'
);
$GEN
->
selContourize
();
$GEN
->
DO_INFO
(
"-t layer -e $Job/$Step/$tmp -d FEAT_HIST"
);
if
(
$GEN
->
{
doinfo
}{
gFEAT_HISTsurf
}
>
0
)
{
for
(
my
$i
=
1
;
$i
<=
$GEN
->
{
doinfo
}{
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_befo
re
=>
'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_befo
re
=>
'yes'
);
$GEN
->
COM
(
'sel_surf2outline'
,
width
=>
1
);
$GEN
->
COM
(
'filter_reset'
,
filter_name
=>
'popup'
);
$GEN
->
selectByFilter
(
feat_types
=>
'arc'
,
polarity
=>
'positive'
,
profile
=>
'all'
);
$GEN
->
selDelete
()
if
$GEN
->
getSelectCount
()
>
0
;
#--->删掉圆弧
my
@feat
=
$GEN
->
getFeatures
(
job
=>
$Job
,
step
=>
$Step
,
layer
=>
$tmp2
);
my
%
hash
;
for
(
my
$i
=
0
;
$i
<
@feat
;
$i
++
){
for
(
my
$k
=
$i
+
1
;
$k
<
@feat
;
$k
++
){
if
((
$feat
[
$i
]
->
{
xs
}
eq
$feat
[
$k
]
->
{
xs
}
&&
$feat
[
$i
]
->
{
ys
}
eq
$feat
[
$k
]
->
{
ys
})
||
(
$feat
[
$i
]
->
{
xs
}
eq
$feat
[
$k
]
->
{
xe
}
&&
$feat
[
$i
]
->
{
ys
}
eq
$feat
[
$k
]
->
{
ye
})
){
$hash
{
$i
.
'star'
}{
x
}
=
$feat
[
$i
]
->
{
xs
};
$hash
{
$i
.
'star'
}{
y
}
=
$feat
[
$i
]
->
{
ys
};
}
if
((
$feat
[
$i
]
->
{
xe
}
eq
$feat
[
$k
]
->
{
xs
}
&&
$feat
[
$i
]
->
{
ye
}
eq
$feat
[
$k
]
->
{
ys
})
||
(
$feat
[
$i
]
->
{
xe
}
eq
$feat
[
$k
]
->
{
xe
}
&&
$feat
[
$i
]
->
{
ye
}
eq
$feat
[
$k
]
->
{
ye
}))
{
$hash
{
$i
.
'end'
}{
x
}
=
$feat
[
$i
]
->
{
xe
};
$hash
{
$i
.
'end'
}{
y
}
=
$feat
[
$i
]
->
{
ye
};
}
}
}
if
(
scalar
(
keys
%
hash
)
==
0
)
{
$GEN
->
affectedLayer
(
affected
=>
'yes'
,
mode=>'single',layer=>$layer,clear_befo
re
=>
'yes'
);
$GEN
->
selRefFeat
(
layers
=>
$tmp2
,
use
=>
'filter'
,
mode=>'touc
h
');
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
');
my $change_scal_x = sprintf("%.3f",1 / $cale_x);
my $change_scal_y = sprintf("%.3f",1 / $cale_y);
$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);
$GEN->COM('
sel_move_other
',target_layer=>$layer,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
);
}
}
}
__END__
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment