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
8129203e
Commit
8129203e
authored
5 years ago
by
Scott Sun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
s
parent
91f888e4
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1418 additions
and
482 deletions
+1418
-482
config.js
config.js
+576
-43
ATS_AIM_input_data_v3_0.js
test/ATS_AIM_input_data_v3_0.js
+187
-0
ATS_AIM_layer_rename_v_2_0.js
test/ATS_AIM_layer_rename_v_2_0.js
+348
-0
mytest.js
test/mytest.js
+307
-439
No files found.
config.js
View file @
8129203e
var
config
=
{
"formats"
:
{
"ODB1"
:
{
"comments"
:
""
,
// 描述
"ODB"
:
{},
"ODB_1"
:
{
"comments"
:
""
,
"arrStep"
:
"stp"
,
"isMerge"
:
"yes"
,
"jobNameRule"
:
"(job)-a"
"isMerge"
:
"yes"
},
"Gerber274_1"
:
{
"Gerber274
x
_1"
:
{
"nf1"
:
3
,
"nf2"
:
0
,
"nf2"
:
5
,
"units"
:
"inch"
,
"zeroes"
:
"leading"
,
"decimal"
:
"no"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
"separator"
:
"*"
,
"threshold"
:
200
,
"drill_only"
:
"no"
,
"multiplier"
:
1
,
"resolution"
:
3
,
"tool_units"
:
"inch"
,
"coordinates"
:
"absolute"
,
"merge_by_rule"
:
"no"
,
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"Gerber274x_2"
:
{
"nf1"
:
3
,
"nf2"
:
5
,
"units"
:
"inch"
,
"zeroes"
:
"leading"
,
"decimal"
:
"no"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
"separator"
:
"*"
,
"threshold"
:
200
,
"drill_only"
:
"no"
,
"multiplier"
:
1
,
"resolution"
:
3
,
"tool_units"
:
"inch"
,
"coordinates"
:
"absolute"
,
"merge_by_rule"
:
"no"
,
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"Excellon2_1"
:
{
"nf1"
:
3
,
"nf2"
:
5
,
"units"
:
"mm"
,
"zeroes"
:
"leading"
,
"decimal"
:
"
yes
"
,
"decimal"
:
"
no
"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
...
...
@@ -26,15 +66,374 @@ var config = {
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"Excellon1_1"
:
{
"nf1"
:
3
,
"Excellon2_2"
:
{
"nf1"
:
2
,
"nf2"
:
3
,
"units"
:
"inch"
,
"zeroes"
:
"leading"
,
"decimal"
:
"no"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
"separator"
:
"nl"
,
"threshold"
:
200
,
"drill_only"
:
"no"
,
"multiplier"
:
1
,
"resolution"
:
3
,
"tool_units"
:
"inch"
,
"coordinates"
:
"absolute"
,
"merge_by_rule"
:
"no"
,
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"Excellon2_3"
:
{
"nf1"
:
2
,
"nf2"
:
5
,
"units"
:
"inch"
,
"zeroes"
:
"trailing"
,
"decimal"
:
"no"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
"separator"
:
"nl"
,
"threshold"
:
200
,
"drill_only"
:
"no"
,
"multiplier"
:
1
,
"resolution"
:
3
,
"tool_units"
:
"mm"
,
"coordinates"
:
"absolute"
,
"merge_by_rule"
:
"no"
,
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"IPC356_1"
:
{
"nf1"
:
2
,
"nf2"
:
4
,
"units"
:
"inch"
,
"zeroes"
:
"none"
,
"decimal"
:
"no"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
"separator"
:
"*"
,
"threshold"
:
200
,
"drill_only"
:
"no"
,
"multiplier"
:
1
,
"resolution"
:
3
,
"tool_units"
:
"inch"
,
"coordinates"
:
"absolute"
,
"merge_by_rule"
:
"no"
,
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
}
},
"customer"
:
{
"Customer_2"
:
{
"path"
:
"C:/Users/Administrator/Desktop/Customer_2"
,
"db"
:
"genesis"
,
"step"
:
"cad"
,
"rules"
:
[
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
tgz$/ig
.
test
(
file
.
name
)
},
"type"
:
"ODB"
,
"format"
:
"ODB"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
ipc$/ig
.
test
(
file
.
name
)
},
"type"
:
"IPC356"
,
"format"
:
"IPC356_1"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
rou$/ig
.
test
(
file
.
name
)
},
"type"
:
"Excellon2"
,
"format"
:
"Excellon2_3"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
art$/ig
.
test
(
file
.
name
)
},
"type"
:
"Gerber274x"
,
"format"
:
"Gerber274x_1"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
drl$/ig
.
test
(
file
.
name
)
},
"type"
:
"Excellon2"
,
"format"
:
"Excellon2_1"
,
"format_params"
:
function
(
props
){
var
params
=
props
.
params
if
(
params
.
nc_param
){
var
leading
=
params
.
nc_param
[
"SUPPRESS_LEAD_ZEROES"
]
var
trailing
=
params
.
nc_param
[
"SUPPRESS_TRAIL_ZEROES"
]
var
zeroes
=
"none"
if
(
/yes/ig
.
test
(
leading
)){
zeroes
=
"leading"
}
if
(
/yes/ig
.
test
(
trailing
)){
zeroes
=
"trailing"
}
return
{
"nf1"
:
params
.
nc_param
[
"INTEGER_PLACES"
]?
Number
(
params
.
nc_param
[
"INTEGER_PLACES"
])
:
3
,
"nf2"
:
params
.
nc_param
[
"DECIMAL_PLACES"
]?
Number
(
params
.
nc_param
[
"DECIMAL_PLACES"
])
:
5
,
"units"
:
/
METRIC
/
ig
.
test
(
params
.
nc_param
[
"OUTPUT_UNITS"
])?
"mm"
:
"inch"
,
"zeroes"
:
zeroes
,
"decimal"
:
"no"
,
"nf_comp"
:
0
,
"break_sr"
:
"yes"
,
"data_type"
:
"ascii"
,
"separator"
:
"nl"
,
"threshold"
:
200
,
"drill_only"
:
"no"
,
"multiplier"
:
1
,
"resolution"
:
3
,
"tool_units"
:
/
METRIC
/
ig
.
test
(
params
.
nc_param
[
"OUTPUT_UNITS"
])?
"mm"
:
"inch"
,
"coordinates"
:
params
.
nc_param
[
"COORDINATES"
]?
params
.
nc_param
[
"COORDINATES"
].
toLowerCase
()
:
"absolute"
,
"merge_by_rule"
:
"no"
,
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
}
}
}
}
],
"tl_name"
:
[
{
"orig_name"
:
"pasttop.art"
,
"tl_name"
:
"past_top"
},
{
"orig_name"
:
"pleg.art"
,
"tl_name"
:
"silk_top"
},
{
"orig_name"
:
"soldtop.art"
,
"tl_name"
:
"sm_top"
},
{
"orig_name"
:
"top.art"
,
"tl_name"
:
"top"
},
{
"orig_name"
:
"lay(
\\
d+)
\\
.art"
,
"tl_name"
:
"l_($1)"
},
{
"orig_name"
:
"bottom.art"
,
"tl_name"
:
"bottom"
},
{
"orig_name"
:
"soldbotm.art"
,
"tl_name"
:
"sm_botm"
},
{
"orig_name"
:
"sleg.art"
,
"tl_name"
:
"silk_bot"
},
{
"orig_name"
:
"pastbotm.art"
,
"tl_name"
:
"past_botm"
},
{
"orig_name"
:
"multipack.art"
,
"tl_name"
:
"array"
},
{
"orig_name"
:
"outline.art"
,
"tl_name"
:
"outline"
},
{
"orig_name"
:
"fab.art"
,
"tl_name"
:
"fab"
},
{
"orig_name"
:
"top-enig"
,
"tl_name"
:
"top-enig"
},
{
"orig_name"
:
"bot-enig"
,
"tl_name"
:
"bot-enig"
},
{
"orig_name"
:
"fab_page2"
,
"tl_name"
:
"fab_page2"
},
{
"orig_name"
:
[
"-(
\\
d+)-(
\\
d+)
\
.drl"
,
"(
\\
d+)-(
\\
d+)-laser
\
.drl"
],
"tl_name"
:
"d_($1)-($2)"
}
]
},
"Customer_1"
:
{
"path"
:
"C:/Users/Administrator/Desktop/Customer_1"
,
"db"
:
"genesis"
,
"step"
:
"cad"
,
"rules"
:
[
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
var
job
=
props
.
job
;
var
reg
=
new
RegExp
(
"^"
+
job
+
"-a"
,
"ig"
)
return
/.+
\.
tgz$/ig
.
test
(
file
.
name
)
&&
reg
.
test
(
file
.
baseName
)
},
"type"
:
"ODB"
,
"format"
:
"ODB_1"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
tgz$/ig
.
test
(
file
.
name
)
},
"type"
:
"ODB"
,
"format"
:
"ODB"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
art$/ig
.
test
(
file
.
name
)
},
"type"
:
"Gerber274x"
,
"format"
:
"Gerber274x_1"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
drl$/ig
.
test
(
file
.
name
)
},
"type"
:
"Excellon2"
,
"format"
:
"Excellon2_1"
}
]
},
"New_data"
:
{
"path"
:
"C:/Users/Administrator/Desktop/New data"
,
"db"
:
"genesis"
,
"step"
:
"pcs"
,
"rules"
:
[
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
tgz$/ig
.
test
(
file
.
name
)
},
"type"
:
"ODB"
,
"format"
:
"ODB"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
art$/ig
.
test
(
file
.
name
)
},
"type"
:
"Gerber274x"
,
"format"
:
"Gerber274x_1"
},
{
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
drl$/ig
.
test
(
file
.
name
)
},
"type"
:
"Excellon2"
,
"format"
:
"Excellon2_2"
}
]
}
},
"data_format"
:
[
{
"tl_name"
:
"^top$"
,
"new_name"
:
"top"
,
"attr"
:{
"context"
:
"board"
,
"type"
:
"signal"
}},
// new_name 里支持特殊变量
{
"tl_name"
:
"l_(
\\
d+)"
,
"new_name"
:
"layer_($1)"
,
"attr"
:{
"context"
:
"board"
,
"type"
:
"signal"
}},
{
"tl_name"
:
"^bottom$"
,
"new_name"
:
"bottom"
,
"attr"
:{
"context"
:
"board"
,
"type"
:
"signal"
}},
{
"tl_name"
:
"d_(
\\
d+)-(
\\
d+)"
,
"new_name"
:
"d($1)-($2)"
,
"attr"
:{
"context"
:
"board"
,
"type"
:
"drill"
}},
{
"tl_name"
:
"drill"
,
"new_name"
:
"drill"
,
"attr"
:{
"context"
:
"board"
,
"type"
:
"drill"
}},
{
"tl_name"
:
"rout"
,
"new_name"
:
"rout"
,
"attr"
:{
"context"
:
"board"
,
"type"
:
"rout"
}}
],
"delSameJob"
:
"yes"
}
module
.
exports
=
config
/*
(function(){
return {
"formats": {
"ODB": {},
"ODB_1": {
"comments": "",
"arrStep": "stp",
"isMerge": "yes"
},
"Gerber274x_1": {
"nf1": 3,
"nf2": 5,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Gerber274x_2": {
"nf1": 3,
"nf2": 5,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_1": {
"nf1": 3,
"nf2": 5,
"units": "mm",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_2": {
"nf1": 2,
"nf2": 3,
"units": "inch",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"Excellon2_3": {
"nf1": 2,
"nf2": 5,
"units": "inch",
"zeroes": "trailing",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"IPC356_1": {
"nf1": 2,
"nf2": 4,
"units": "inch",
"zeroes": "none",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
...
...
@@ -47,26 +446,85 @@ var config = {
"text_line_width": 0.0024
}
},
"cust
"
:
{
"c1
"
:
{
"path"
:
"C:/Users/Administrator/Desktop/Customer_1
"
,
"customer
": {
"Customer_2
": {
"path": "C:/Users/Administrator/Desktop/Customer_2
",
"db": "genesis",
"step": "cad",
"rules": [
{
"valid"
:
""
,
// 文件正则 func true/false
"type"
:
"ODB"
,
// 格式 odb gerber
"format"
:
"ODB1"
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.ipc$/ig.test(file.name)
},
"type": "IPC356",
"format": "IPC356_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.rou$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_3"
},
{
"valid"
:
""
,
// 文件正则 func
"type"
:
"Gerber274"
,
// 格式 odb gerber
"format"
:
"Gerber274_1"
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid"
:
""
,
// 文件正则 func
"type"
:
"Excellon1"
,
// 格式 odb gerber
"format"
:
"Excellon1_1"
,
"rename"
:
{}
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_1",
"format_params": function(props){
var params = props.params
if(params.nc_param){
var leading = params.nc_param["SUPPRESS_LEAD_ZEROES"]
var trailing = params.nc_param["SUPPRESS_TRAIL_ZEROES"]
var zeroes = "none"
if(/yes/ig.test(leading)){
zeroes = "leading"
}
if(/yes/ig.test(trailing)){
zeroes = "trailing"
}
return {
"nf1": params.nc_param["INTEGER_PLACES"]? Number(params.nc_param["INTEGER_PLACES"]) : 3,
"nf2": params.nc_param["DECIMAL_PLACES"]? Number(params.nc_param["DECIMAL_PLACES"]) : 5,
"units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
"zeroes": zeroes,
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": /METRIC/ig.test(params.nc_param["OUTPUT_UNITS"])? "mm" :"inch",
"coordinates": params.nc_param["COORDINATES"]? params.nc_param["COORDINATES"].toLowerCase() :"absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
}
}
}
}
],
"tlname": [
...
...
@@ -84,11 +542,86 @@ var config = {
{"orig_name" : "bot-enig", "tlname" : "bot-enig" },
{"orig_name" : "fab_page2", "tlname" : "fab_page2" }
]
},
"Customer_1": {
"path": "C:/Users/Administrator/Desktop/Customer_1",
"db": "genesis",
"step": "cad",
"rules": [
{
"valid": function(props){
var file = props.file;
var job = props.job;
var reg = new RegExp("^"+job+"-a","ig")
return /.+\.tgz$/ig.test(file.name) && reg.test(file.baseName)
},
"type": "ODB",
"format": "ODB_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_1"
}
]
},
"sort_rename"
:
[
{
"tlname"
:
""
,
"newname"
:
""
}
// newname 里支持特殊变量
"New_data": {
"path": "C:/Users/Administrator/Desktop/New data",
"db": "genesis",
"step": "pcs",
"rules": [
{
"valid": function(props){
var file = props.file;
return /.+\.tgz$/ig.test(file.name)
},
"type": "ODB",
"format": "ODB"
},
{
"valid": function(props){
var file = props.file;
return /.+\.art$/ig.test(file.name)
},
"type": "Gerber274x",
"format": "Gerber274x_1"
},
{
"valid": function(props){
var file = props.file;
return /.+\.drl$/ig.test(file.name)
},
"type": "Excellon2",
"format": "Excellon2_2"
}
]
}
},
"sort_rename": [
{"tlname":"" , "newname":"" }
],
"delSameJob": "yes"
}
})()
}
\ No newline at end of file
*/
\ No newline at end of file
This diff is collapsed.
Click to expand it.
test/ATS_AIM_input_data_v3_0.js
0 → 100644
View file @
8129203e
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
IKM
=
$
.
ikm
;
var
GEN
=
$
.
gen
;
var
GUI
=
$
.
gui
;
var
Job
=
$
.
job
;
var
JobId
=
$
.
job_id
;
try
{
var
config
=
require
(
"../config.js"
)
// 读取配置文件
var
cfg
=
IKM
.
select_value
({
table
:
'pub_conf'
,
field
:
'text_data'
,
where
:{
path
:
'cam/input_data'
}})
var
par
=
{
// todo
job
:
"I6"
,
customer
:
"Customer_2"
}
// var config = eval(cfg)
var
job
=
par
.
job
.
toLowerCase
();
// 如果genesis已经存在这个料号
err
=
delSameJob
({
job
:
job
,
delSame
:
config
.
delSameJob
});
if
(
err
){
throw
err
};
var
custCfg
=
config
.
customer
[
par
.
customer
]
var
step
=
custCfg
.
step
.
toLowerCase
()
// 获取路径下文件信息
var
pathInfo
=
fs
.
listDir
(
custCfg
.
path
,
1
)
// 判断存不存在料号文件
var
jobFile
=
pathInfo
.
filter
(
function
(
v
){
return
v
.
baseName
.
toLowerCase
()
==
job
})
if
(
jobFile
.
length
==
0
){
throw
"job file is not exist"
}
var
jobFiles
=
[]
// 记录要分析的文件
if
(
!
jobFile
[
0
].
isDir
)
{
jobFiles
.
push
(
jobFile
[
0
])
}
else
{
jobFiles
=
fs
.
listDir
(
jobFile
[
0
].
path
)
}
var
jobInfo
=
analyJobFiles
({
jobFiles
:
jobFiles
.
filter
(
function
(
v
){
return
v
.
isFile
}),
custCfg
:
custCfg
,
config
:
config
,
job
:
job
})
var
importOk
=
false
;
if
(
/odb/ig
.
test
(
jobInfo
.
type
)){
// odb导入
if
(
jobInfo
.
data
.
length
==
0
){
throw
"file error"
}
if
(
jobInfo
.
data
.
length
==
1
){
var
err
=
importJob
({
name
:
job
,
db
:
custCfg
.
db
,
path
:
jobInfo
.
data
[
0
].
file
.
path
},
config
.
delSameJob
)
if
(
err
){
throw
err
}
}
else
{
var
mergeFiles
=
jobInfo
.
data
.
filter
(
function
(
item
){
var
err
=
importJob
({
name
:
item
.
file
.
baseName
,
db
:
custCfg
.
db
,
path
:
item
.
file
.
path
},
config
.
delSameJob
)
if
(
err
){
throw
err
}
return
/yes/ig
.
test
(
item
.
format
.
isMerge
)
})
var
arr_job
=
mergeFiles
[
0
]
GEN
.
openJob
({
job
:
job
});
GEN
.
openJob
({
job
:
arr_job
.
file
.
baseName
});
GEN
.
copyStep
({
source_job
:
arr_job
.
file
.
baseName
,
source_name
:
arr_job
.
format
.
arrStep
,
dest_job
:
job
,
dest_name
:
arr_job
.
format
.
arrStep
,
});
GEN
.
closeJob
({
job
:
arr_job
.
file
.
baseName
});
GEN
.
deleteJob
({
job
:
arr_job
.
file
.
baseName
});
}
importOk
=
true
}
if
(
/gerber/ig
.
test
(
jobInfo
.
type
)){
// gerber导入
GEN
.
createJob
({
name
:
job
,
db
:
custCfg
.
db
})
GEN
.
createStep
({
job
:
job
,
name
:
step
})
var
gerberInfo
=
jobInfo
.
data
.
map
(
function
(
item
){
var
gerberCfg
=
JSON
.
parse
(
JSON
.
stringify
(
item
.
format
));
var
file
=
item
.
file
gerberCfg
.
layer
=
file
.
name
.
toLowerCase
()
gerberCfg
.
path
=
file
.
path
gerberCfg
.
format
=
item
.
type
gerberCfg
.
job
=
job
gerberCfg
.
step
=
step
return
gerberCfg
})
GEN
.
COM
(
"input_manual_reset"
)
gerberInfo
.
forEach
(
function
(
v
){
GEN
.
COM
(
"input_manual_set"
,
v
)
})
GEN
.
COM
(
"input_manual"
)
importOk
=
true
}
if
(
!
importOk
){
throw
"import error"
}
var
matrix
=
GEN
.
getMatrix
({
job
:
job
});
comp
=
Object
.
keys
(
matrix
).
filter
(
function
(
v
){
return
/^comp_
\+
_/ig
.
test
(
v
)
})
if
(
comp
.
length
>
0
){
var
tmp
=
GEN
.
getStepList
({
job
:
job
})
GEN
.
openStep
({
job
:
job
,
name
:
tmp
[
0
]})
GEN
.
COM
(
"delete_comp"
)
GEN
.
closeStep
()
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 自动保存
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
return
'Done'
;
}
catch
(
error
)
{
GUI
.
msg
(
error
)
return
'Error'
;
}
function
delSameJob
(
props
){
var
job
=
props
.
job
var
delSame
=
props
.
delSame
if
(
GEN
.
isJobExists
({
job
:
job
})){
if
(
/^yes$/ig
.
test
(
delSame
)){
if
(
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
closeJob
({
job
:
job
})
}
GEN
.
deleteJob
({
job
:
job
})
}
else
{
return
"job "
+
job
+
" exist"
}
}
}
function
analyJobFiles
(
props
){
var
files
=
props
.
jobFiles
;
var
config
=
props
.
config
;
var
job
=
props
.
job
;
var
custCfg
=
props
.
custCfg
;
var
rules
=
custCfg
.
rules
;
var
paramsFile
=
files
.
filter
(
function
(
file
){
return
/param/ig
.
test
(
file
.
baseName
)})
var
tmp_hash
=
{}
paramsFile
.
forEach
(
function
(
file
){
tmp_hash
[
file
.
baseName
]
=
(
function
(){
var
tmparr
=
fs
.
readFile
(
file
.
path
).
split
(
"
\n
"
)
var
tmp
=
{}
tmparr
.
map
(
function
(
v
){
var
arr
=
v
.
split
(
/
\b\s
+
\b
/
)
tmp
[
arr
[
0
].
replace
(
/-/ig
,
"_"
)]
=
arr
[
1
]
})
return
tmp
})()
})
var
fileInfo
=
files
.
reduce
(
function
(
a
,
file
){
try
{
rules
.
forEach
(
function
(
item
){
if
(
item
.
valid
({
file
:
file
,
job
:
job
})){
var
format
=
config
.
formats
[
item
.
format
]
var
format1
;
if
(
item
.
format_params
){
format1
=
item
.
format_params
({
params
:
tmp_hash
})
}
if
(
format1
){
throw
{
file
:
file
,
type
:
item
.
type
,
format
:
format1
}
}
else
{
throw
{
file
:
file
,
type
:
item
.
type
,
format
:
format
}
}
}
})
}
catch
(
info
)
{
a
.
push
(
info
)
}
return
a
},[])
var
odbfiles
=
fileInfo
.
filter
(
function
(
item
){
return
/odb/ig
.
test
(
item
.
type
)})
if
(
odbfiles
.
length
==
0
){
return
{
type
:
"Gerber"
,
data
:
fileInfo
}
}
else
{
return
{
type
:
"ODB"
,
data
:
odbfiles
}
}
}
function
importJob
(
props
,
delSameJob
){
var
name
=
props
.
name
if
(
GEN
.
isJobExists
({
job
:
name
}))
{
if
(
/^yes$/ig
.
test
(
delSameJob
))
{
if
(
GEN
.
isJobOpen
({
job
:
name
})){
GEN
.
closeJob
({
job
:
name
});
}
GEN
.
deleteJob
({
job
:
name
});
}
else
{
return
"job "
+
name
+
" exist"
;
}
}
GEN
.
importJob
(
props
);
}
This diff is collapsed.
Click to expand it.
test/ATS_AIM_layer_rename_v_2_0.js
0 → 100644
View file @
8129203e
/*
NAME:
DESCRIPTION: matrix改名和排序
PARAMETER:
[
{
name : 'customer',
title : 'CUSTOMER 名',
type : 'LineEdit',
property : {tool_tip : '客户名称'}
},
{
name : 'job_name',
title : '料号名',
type : 'LineEdit',
property : {tool_tip : '料号名'}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> matrix改名和排序</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> matrix改名和排序规则 </p>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
*/
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
IKM
=
$
.
ikm
;
var
GEN
=
$
.
gen
;
var
GUI
=
$
.
gui
;
var
Job
=
$
.
job
;
try
{
var
mode
=
"develop"
// develop
var
config
=
require
(
"../config.js"
)
// 读取配置文件
var
par
=
{
// todo
job
:
"I3"
,
customer
:
"Customer_2"
}
var
job
=
par
.
job
.
toLowerCase
();
// 获取料号
var
custCfg
=
config
.
customer
[
par
.
customer
]
// 获取客户配置
var
step
=
custCfg
.
step
.
toLowerCase
()
// 获取pcs_step
// 料号验证
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"job "
+
job
+
" is not exist"
}
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})}
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
&&
mode
!=
"develop"
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// start martix_tl_name
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
tl_name_matrix
=
tlNameMatrix
({
matrix
:
matrix
,
tl_name
:
custCfg
.
tl_name
})
// 给matrix信息添加tl_name
// tl_name_matrix.forEach(function(item){
// IKM.add({name:item.name, tl_name:item.tl_name})
// })
// IKM.add("",1)
var
format_cfg
=
config
.
data_format
// 拿到数据标准化配置
// 排序和设属性
var
ret
=
sortLayer
({
job
:
job
,
rule
:
format_cfg
,
matrix
:
tl_name_matrix
})
if
(
ret
.
err
){
throw
err
}
var
after_sort_matrix
=
ret
.
sortNames
// 设置钻孔
err
=
setDrill
({
job
:
job
,
matrix
:
after_sort_matrix
})
if
(
err
){
throw
err
}
// 改名
err
=
reName
({
job
:
job
,
matrix
:
after_sort_matrix
,
cfg
:
format_cfg
})
if
(
err
){
throw
err
}
return
'Done'
;
}
catch
(
error
)
{
GUI
.
msg
(
error
);
return
'Error'
;
}
function
tlNameMatrix
(
props
){
// 设置标准名
var
matrix
=
props
.
matrix
var
tlname_rules
=
[]
props
.
tl_name
.
forEach
(
function
(
item
){
if
(
typeof
item
.
orig_name
==
"string"
){
tlname_rules
.
push
(
item
)
}
else
{
item
.
orig_name
.
forEach
(
function
(
name2
){
tlname_rules
.
push
({
orig_name
:
name2
,
tl_name
:
item
.
tl_name
})
})
}
})
IKM
.
msg
(
tlname_rules
)
var
res
=
Object
.
keys
(
matrix
).
map
(
function
(
key
){
var
val
=
matrix
[
key
]
var
tlRule
=
tlname_rules
.
filter
(
function
(
rule
){
if
(
rule
.
orig_name
===
key
){
return
true
}
var
reg
=
new
RegExp
(
rule
.
orig_name
,
"ig"
)
return
reg
.
test
(
key
)
})
if
(
tlRule
.
length
==
0
){
return
val
}
for
(
var
i
=
0
;
i
<
tlRule
.
length
;
i
++
){
if
(
tlRule
[
i
].
orig_name
===
key
){
return
_
.
assign
(
val
,{
tl_name
:
tlRule
[
0
].
tl_name
})}
}
var
reg
=
new
RegExp
(
tlRule
[
0
].
orig_name
,
"ig"
)
var
tmp
=
reg
.
exec
(
key
)
if
(
tmp
&&
tmp
.
length
){
var
replaceArr
=
tmp
.
slice
(
1
)
var
tl_name
=
tlRule
[
0
].
tl_name
var
params
=
{}
for
(
var
i
=
0
;
i
<
replaceArr
.
length
;
i
++
){
params
[
"$"
+
(
i
+
1
)]
=
replaceArr
[
i
]
}
replaceArr
.
forEach
(
function
(
v
,
i
){
tl_name
=
tl_name
.
replace
(
"($"
+
(
i
+
1
)
+
")"
,
v
)
})
tl_name
=
replaceTlName
(
tl_name
)
function
replaceTlName
(
name
){
var
tmp
=
/
(\([^
)
]
*
\))
/ig
.
exec
(
name
)
if
(
!
tmp
){
return
name
}
var
param_arr
=
tmp
[
1
].
match
(
/
\$\d
+/ig
)
var
newname
=
tmp
[
1
]
param_arr
.
forEach
(
function
(
v
){
newname
=
newname
.
replace
(
new
RegExp
(
"
\
\"
+v,"
ig
"), params[v])
})
newname = name.replace(tmp[1],eval(newname))
return replaceTlName(newname)
}
return _.assign(val,{tl_name:tl_name})
}else {
return _.assign(val,{tl_name:tlRule[0].tl_name})
}
})
return res
}
function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则}
var job = props.job
var matrix = GEN.getMatrix({job:job})
var tl_matrix = props.matrix
var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
var matrixFirst = matrixName[0]; // 记录matrix中第一位
var sortNames = [];
var miscName = tl_matrix.filter(function(value){ // 找出需要排序的名称列表
var flag = true;
if (!value.tl_name || value.tl_name == ""){return true}
var tl_name = value.tl_name
props.rule.forEach(function(item,i){
var evalReg = "
/
"+item.tl_name+"
/
ig
.
test
(
tl_name
)
";
if(tl_name == item.tl_name || eval(evalReg)){
flag = false;
if(tl_name === item.tl_name){
var _item = JSON.parse(JSON.stringify(item));
_item.value = i;
_item.name = value.name
_item.rule = item.tl_name
sortNames.push(_item);
} else {
var _item = JSON.parse(JSON.stringify(item));
_item.value = i;
var str = "
/
"+ item.tl_name +"
/
ig
.
exec
(
tl_name
)
"
_item.value2 = eval(str).pop() - 0;
_item.name = value.name
_item.rule = item.tl_name
_item.tl_name = tl_name;
sortNames.push(_item);
}
}
});
return flag;
}).map(function(v){return v.name})
miscName.forEach(function(n){
if(matrix[n].context == 'board'){
GEN.matrixLayerAttr({job:job,layer:n,context:'misc'})
}
})
sortNames = sortNames.sort(function(a,b){
return a.value - b.value || a.value2 - b.value2
})
// 排序
if(sortNames.length){
if(sortNames[0].name !== matrixFirst) { // 如果第一位和matrix中第一位不同,先把第一位插入到最前面
GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst })
}
sortNames.forEach(function(v,i,arr){
if(i !== 0){
GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })
}
GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
})
}
return {
sortNames:sortNames
}
}
function setDrill(props){ // 设置钻孔
var job = props.job
var matrix = props.matrix
// 获取所有的钻孔层
var drillLayer =matrix.filter(function(v){
return v.attr.type == "
drill
" && v.attr.context == "
board
"
})
// 获取所有single层
var signalLayer =matrix.filter(function(v){
return v.attr.type == "
signal
" && v.attr.context == "
board
"
})
var layerCount = GEN.getLayerCount({job:job})
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
function findSignal(num){
return signalLayer[Number(num-1)].name
}
function doDrill(drills){ // 分析钻孔层
return drills.map(function(v){
if(v == "
drill
" || v=="
rout
"){
return {start:findSignal[1], end:findSignal[layerCount], layer:v.name}
} else {
var tmp = /(
\
d+)-(
\
d+)/ig.exec(v.tl_name);
if(tmp){
var start = findSignal(tmp[1]);
var end = findSignal(tmp[2]);
return {start:start, end:end, layer:v.name}
} else {
return 0;
}
}
})
}
var drillSetList = doDrill(drillLayer); // 分析得到钻孔设置结果
drillSetList = drillSetList.filter(function(v){return v!==0})
drillSetList.forEach(function(v){
GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end})
})
}
function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
var job = props.job
var matrix = props.matrix
var cfg = props.cfg
matrix = matrix.filter(function(v){return v.name != v.new_name})
var rename_list = matrix.map(function(item){
var new_name;
var tl_name = item.tl_name
var rule = item.rule
if(rule === tl_name){
new_name = item.new_name
} else {
var reg = new RegExp(rule,"
ig
")
var tmp = reg.exec(tl_name)
if(!tmp){return undefined}
var replaceArr = tmp.slice(1)
new_name = item.new_name
var params = {}
for(var i = 0; i<replaceArr.length;i++){
params["
$
"+(i+1)] = replaceArr[i]
}
replaceArr.forEach(function(v,i){
tl_name = tl_name.replace("
(
$
"+(i+1)+"
)
",v)
})
new_name = replaceTlName(new_name)
function replaceTlName(name){
var tmp = /(
\
([^)]*
\
))/ig.exec(name)
if(!tmp){ return name }
var param_arr = tmp[1].match(/
\
$
\
d+/ig)
var newname = tmp[1]
param_arr.forEach(function(v){
newname = newname.replace(new RegExp("
\\
"+v,"
ig
"), params[v])
})
newname = name.replace(tmp[1],eval(newname))
return replaceTlName(newname)
}
}
return {
orig_name: item.name,
new_name: new_name
}
})
rename_list = rename_list.filter(function(v){
var flag = true
if(!v){flag = false}
if(!v.orig_name || !v.new_name ){flag = false}
return flag
})
rename_list.forEach(function(v){
if(v.orig_name !== v.new_name){
GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name})
}
});
}
function mergeDrill(props){ // 合并钻孔
var newdrills = []
var job = props.job;
var step = GEN.getStepList({job:job})[0];
var maxDrill = {name:"",value:0};
function getDrl(str){
var num = /(
\
d+)-(
\
d+)/ig.exec(str); // 匹配出 num-num
var tmp = [];
for(var i = Number(num[1]);i<num[2];i++){
if(i == 1){
maxDrill = Number(num[2]) > maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
}
tmp.push("
L
"+i+"
-
"+(i+1));
}
return tmp;
}
var matrix = GEN.getMatrix({job:job});
GEN.openStep({job : job,name:step});
for(var key in matrix){
var val = matrix[key];
if(val.layer_type == "
drill
"){
var mergeTo = getDrl(val.name) // 要合并到的地方
mergeTo.forEach(function(layerName){
if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0){
GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
}
if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()})){
GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
newdrills.push(layerName.toLowerCase())
}
GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
})
}
}
// 合并到maxDrill独立合并
GEN.createLayer({job:job,layer:"
b1
-
"+maxDrill.value,conext:'board',type:'drill'});
GEN.workLayer({name:"
b1
-
"+maxDrill.value,display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"
b1
-
"+maxDrill.value});
GEN.affectedLayer({affected:"
no
",mode:"
all
"});
GEN.closeStep();
return this;
}
This diff is collapsed.
Click to expand it.
test/mytest.js
View file @
8129203e
/*
NAME:
DESCRIPTION: matrix改名和排序
PARAMETER:
[
{
name : 'customer',
title : 'CUSTOMER 名',
type : 'LineEdit',
property : {tool_tip : '客户名称'}
},
{
name : 'job_name',
title : '料号名',
type : 'LineEdit',
property : {tool_tip : '料号名'}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> matrix改名和排序</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> matrix改名和排序规则 </p>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> ● 无 </p>
<br>
</body></html>
*/
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
...
...
@@ -6,475 +41,308 @@ var IKM = $.ikm;
var
GEN
=
$
.
gen
;
var
GUI
=
$
.
gui
;
var
Job
=
$
.
job
;
var
JobId
=
$
.
job_id
;
try
{
var
cfg
=
JSON
.
parse
(
IKM
.
select_value
({
table
:
'pub_conf'
,
field
:
'json_data'
,
where
:{
path
:
'cam/input_data'
}}));
// 读取配置文件
var
useCfg
=
cfg
.
ats
;
// todo 选择使用哪个客户的配置
addDefaultCfg
(
cfg
.
def
,
useCfg
)
// 添加默认配置
/* useCfg 测试配置
"job": "1",
"path": "C:/Users/Administrator/Desktop/Customer_1",
"step": "cad",
"ODB": {
"db": "genesis",
"files": ["tgz"],
"arrStep": "stp",
"isMerge": "yes",
"jobNameRule": "(job)-a"
},
"Gerber": {
"db": "genesis",
"files": ["drd", "drl", "phd", "phl"],
"editFile": [{
"filter": "drd",
"callback": "function(props){}"
}],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Wheel",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
}
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
*/
// todo job来源
var
job
=
"1"
||
"demo"
,
path
=
useCfg
.
path
,
step
=
useCfg
.
step
,
err
;
err
=
delSameJob
({
job
:
job
,
delSame
:
useCfg
.
delSameJob
});
if
(
err
){
throw
err
}
// 判断导入方式 处理path
var
jobPath
=
path
+
"/"
+
job
if
(
!
fs
.
exists
(
jobPath
)){
throw
"path error"
}
var
pathInfo
=
getPathInfo
({
path
:
jobPath
,
cfg
:
useCfg
})
// 分析path下的文件
if
(
!
pathInfo
.
type
){
throw
"file error"
}
// pathInfo.type "ODB" or "Gerber"
var
input_ok
=
false
// 判断是不是导入成功
// 分支 导入ODB
if
(
pathInfo
.
type
==
"ODB"
){
var
odb
=
useCfg
.
ODB
var
fileInfo
=
getFileInfo
({
inputConfig
:
odb
,
path
:
jobPath
,
files
:
pathInfo
.
files
})
// 获取导入文件信息
if
(
/^yes$/ig
.
test
(
odb
.
isMerge
)
&&
fileInfo
.
length
>
1
){
var
err
=
mergeJob
({
odb
:
odb
,
job
:
job
,
fileInfo
:
fileInfo
,
delSameJob
:
useCfg
.
delSameJob
})
var
mode
=
"develop"
// develop
var
config
=
require
(
"../config.js"
)
// 读取配置文件
var
par
=
{
// todo
job
:
"I3"
,
customer
:
"Customer_2"
}
var
job
=
par
.
job
.
toLowerCase
();
// 获取料号
var
custCfg
=
config
.
customer
[
par
.
customer
]
// 获取客户配置
var
step
=
custCfg
.
step
.
toLowerCase
()
// 获取pcs_step
// 料号验证
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"job "
+
job
+
" is not exist"
}
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})}
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
&&
mode
!=
"develop"
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// start martix_tl_name
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
tl_name_matrix
=
tlNameMatrix
({
matrix
:
matrix
,
tl_name
:
custCfg
.
tl_name
})
// 给matrix信息添加tl_name
// tl_name_matrix.forEach(function(item){
// IKM.add({name:item.name, tl_name:item.tl_name})
// })
// IKM.add("",1)
var
format_cfg
=
config
.
data_format
// 拿到数据标准化配置
// 排序和设属性
var
ret
=
sortLayer
({
job
:
job
,
rule
:
format_cfg
,
matrix
:
tl_name_matrix
})
if
(
ret
.
err
){
throw
err
}
var
after_sort_matrix
=
ret
.
sortNames
// 设置钻孔
err
=
setDrill
({
job
:
job
,
matrix
:
after_sort_matrix
})
if
(
err
){
throw
err
}
}
else
{
var
jobInfo
=
fileInfo
.
filter
(
function
(
v
){
return
v
.
baseName
==
job
})[
0
]
if
(
jobInfo
.
length
==
0
){
throw
"file error"
}
var
err
=
importJob
({
name
:
job
,
db
:
odb
.
db
,
path
:
jobInfo
.
path
},
useCfg
.
delSameJob
)
// 改名
err
=
reName
({
job
:
job
,
matrix
:
after_sort_matrix
,
cfg
:
format_cfg
})
if
(
err
){
throw
err
}
}
input_ok
=
true
}
// 分支 导入Gerber
if
(
pathInfo
.
type
==
"Gerber"
){
var
gerber
=
useCfg
.
Gerber
// 如果要修改文件
if
(
gerber
.
editFile
&&
gerber
.
editFile
.
length
){
// 将文件拷贝一份到_tmp
var
tmpDir
=
path
+
"/"
+
job
+
"_tmp"
if
(
!
fs
.
exists
(
tmpDir
)){
fs
.
mkdir
(
tmpDir
)}
var
srcFiles
=
[]
pathInfo
.
files
.
forEach
(
function
(
v
){
srcFiles
.
push
(
v
)
fs
.
copyFile
(
v
.
path
,
tmpDir
+
"/"
+
v
.
name
,
true
)
})
jobPath
=
tmpDir
pathInfo
.
files
=
fs
.
listDir
(
tmpDir
,
1
)
// 配置操作
gerber
.
editFile
.
forEach
(
function
(
item
){
var
filter
=
item
.
filter
var
fn
=
eval
(
item
.
callback
)
pathInfo
.
files
.
forEach
(
function
(
file
){
var
reg
=
new
RegExp
(
file
.
suffix
,
"ig"
)
if
(
reg
.
test
(
filter
)){
fn
.
call
({},{
fs
:
fs
,
nowFile
:
file
,
srcFiles
:
srcFiles
})
}
})
})
}
var
fileInfo
=
getFileInfo
({
inputConfig
:
gerber
,
path
:
jobPath
,
files
:
pathInfo
.
files
})
// 获取导入文件信息
// 导入gerber数据
importGerber
({
job
:
job
,
step
:
step
,
gerber
:
gerber
,
fileInfo
:
fileInfo
})
input_ok
=
true
}
if
(
!
input_ok
){
throw
"input failed"
}
// end
if
(
/^yes$/ig
.
test
(
useCfg
.
isDelComp
)){
// 删除comp层
var
matrix
=
GEN
.
getMatrix
({
job
:
job
});
comp
=
Object
.
keys
(
matrix
).
filter
(
function
(
v
){
return
/^comp_
\+
_/ig
.
test
(
v
)
})
if
(
comp
.
length
>
0
){
var
tmp
=
GEN
.
getStepList
({
job
:
job
})
GEN
.
openStep
({
job
:
job
,
name
:
tmp
[
0
]})
GEN
.
COM
(
"delete_comp"
)
GEN
.
closeStep
()
}
}
if
(
/^yes$/ig
.
test
(
useCfg
.
autoSave
)){
// 自动保存
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
GEN
.
saveJob
({
job
:
job
});
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
GUI
.
msg
(
"end"
)
return
'Done'
;
}
catch
(
error
)
{
GUI
.
msg
(
error
)
GUI
.
msg
(
error
)
;
return
'Error'
;
}
function
addDefaultCfg
(
def
,
use
)
{
for
(
var
key
in
def
)
{
var
val
=
def
[
key
]
if
(
typeof
val
==
"string"
&&
!
use
.
hasOwnProperty
(
key
))
{
use
[
key
]
=
val
}
else
if
(
typeof
val
==
"object"
&&
use
.
hasOwnProperty
(
key
))
{
if
(
!
use
[
key
].
hasOwnProperty
(
"db"
))
{
use
[
key
].
db
=
val
.
db
}
if
(
!
use
[
key
].
hasOwnProperty
(
"files"
))
{
use
[
key
].
files
=
val
.
files
}
}
if
(
key
==
"Gerber"
&&
use
.
hasOwnProperty
(
key
))
{
for
(
var
gkey
in
val
.
format
)
{
if
(
!
use
[
key
].
hasOwnProperty
(
"format"
))
{
use
[
key
].
format
=
val
.
format
}
else
if
(
!
use
[
key
].
format
.
hasOwnProperty
(
gkey
))
{
use
[
key
].
format
[
gkey
]
=
val
.
format
[
gkey
]
}
function
tlNameMatrix
(
props
){
// 设置标准名
var
matrix
=
props
.
matrix
var
tlname_rules
=
[]
props
.
tl_name
.
forEach
(
function
(
item
){
if
(
typeof
item
.
orig_name
==
"string"
){
tlname_rules
.
push
(
item
)
}
else
{
item
.
orig_name
.
forEach
(
function
(
name2
){
tlname_rules
.
push
({
orig_name
:
name2
,
tl_name
:
item
.
tl_name
})
})
}
})
IKM
.
msg
(
tlname_rules
)
var
res
=
Object
.
keys
(
matrix
).
map
(
function
(
key
){
var
val
=
matrix
[
key
]
var
tlRule
=
tlname_rules
.
filter
(
function
(
rule
){
if
(
rule
.
orig_name
===
key
){
return
true
}
var
reg
=
new
RegExp
(
rule
.
orig_name
,
"ig"
)
return
reg
.
test
(
key
)
})
if
(
tlRule
.
length
==
0
){
return
val
}
for
(
var
i
=
0
;
i
<
tlRule
.
length
;
i
++
){
if
(
tlRule
[
i
].
orig_name
===
key
){
return
_
.
assign
(
val
,{
tl_name
:
tlRule
[
0
].
tl_name
})}
}
var
reg
=
new
RegExp
(
tlRule
[
0
].
orig_name
,
"ig"
)
var
tmp
=
reg
.
exec
(
key
)
if
(
tmp
&&
tmp
.
length
){
var
replaceArr
=
tmp
.
slice
(
1
)
var
tl_name
=
tlRule
[
0
].
tl_name
var
params
=
{}
for
(
var
i
=
0
;
i
<
replaceArr
.
length
;
i
++
){
params
[
"$"
+
(
i
+
1
)]
=
replaceArr
[
i
]
}
replaceArr
.
forEach
(
function
(
v
,
i
){
tl_name
=
tl_name
.
replace
(
"($"
+
(
i
+
1
)
+
")"
,
v
)
})
tl_name
=
replaceTlName
(
tl_name
)
function
replaceTlName
(
name
){
var
tmp
=
/
(\([^
)
]
*
\))
/ig
.
exec
(
name
)
if
(
!
tmp
){
return
name
}
var
param_arr
=
tmp
[
1
].
match
(
/
\$\d
+/ig
)
var
newname
=
tmp
[
1
]
param_arr
.
forEach
(
function
(
v
){
newname
=
newname
.
replace
(
new
RegExp
(
"
\
\"
+v,"
ig
"), params[v])
})
newname = name.replace(tmp[1],eval(newname))
return replaceTlName(newname)
}
return _.assign(val,{tl_name:tl_name})
}else {
return _.assign(val,{tl_name:tlRule[0].tl_name})
}
})
return res
}
function
delSameJob
(
props
){
function sortLayer(props){ // 排序方法 {job:要排序的料号, rule: {要改名的规则}
var job = props.job
var
delSame
=
props
.
delSame
if
(
GEN
.
isJobExists
({
job
:
job
})){
if
(
/^yes$/ig
.
test
(
delSame
)){
if
(
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
closeJob
({
job
:
job
})
}
GEN
.
deleteJob
({
job
:
job
})
var matrix = GEN.getMatrix({job:job})
var tl_matrix = props.matrix
var matrixName = Object.keys(matrix).sort(function(a,b){return matrix[a].row - matrix[b].row})
var matrixFirst = matrixName[0]; // 记录matrix中第一位
var sortNames = [];
var miscName = tl_matrix.filter(function(value){ // 找出需要排序的名称列表
var flag = true;
if (!value.tl_name || value.tl_name == ""){return true}
var tl_name = value.tl_name
props.rule.forEach(function(item,i){
var evalReg = "
/
"+item.tl_name+"
/
ig
.
test
(
tl_name
)
";
if(tl_name == item.tl_name || eval(evalReg)){
flag = false;
if(tl_name === item.tl_name){
var _item = JSON.parse(JSON.stringify(item));
_item.value = i;
_item.name = value.name
_item.rule = item.tl_name
sortNames.push(_item);
} else {
return
"job "
+
job
+
" exist"
var _item = JSON.parse(JSON.stringify(item));
_item.value = i;
var str = "
/
"+ item.tl_name +"
/
ig
.
exec
(
tl_name
)
"
_item.value2 = eval(str).pop() - 0;
_item.name = value.name
_item.rule = item.tl_name
_item.tl_name = tl_name;
sortNames.push(_item);
}
}
}
function
getPathInfo
(
props
){
var
path
=
props
.
path
var
cfg
=
props
.
cfg
var
res
=
{}
res
.
files
=
fs
.
listDir
(
path
)
res
.
fileSuffix
=
res
.
files
.
reduce
(
function
(
a
,
b
){
if
(
b
.
isFile
&&
a
.
indexOf
(
b
.
suffix
)
<
0
){
a
.
push
(
b
.
suffix
)
});
return flag;
}).map(function(v){return v.name})
miscName.forEach(function(n){
if(matrix[n].context == 'board'){
GEN.matrixLayerAttr({job:job,layer:n,context:'misc'})
}
return
a
},[])
if
(
cfg
.
Gerber
){
res
.
type
=
cfg
.
Gerber
.
files
.
reduce
(
function
(
a
,
b
){
if
(
res
.
fileSuffix
.
indexOf
(
b
)
<
0
){
a
=
false
})
sortNames = sortNames.sort(function(a,b){
return a.value - b.value || a.value2 - b.value2
})
// 排序
if(sortNames.length){
if(sortNames[0].name !== matrixFirst) { // 如果第一位和matrix中第一位不同,先把第一位插入到最前面
GEN.matrixMoveRow({ job:job,layer:sortNames[0].name,before:matrixFirst })
}
return
a
},
true
)?
"Gerber"
:
undefined
sortNames.forEach(function(v,i,arr){
if(i !== 0){
GEN.matrixMoveRow({ job:job,layer:v.name,after:arr[i-1].name })
}
if
(
cfg
.
ODB
){
res
.
type
=
cfg
.
ODB
.
files
.
reduce
(
function
(
a
,
b
){
if
(
res
.
fileSuffix
.
indexOf
(
b
)
<
0
){
a
=
false
GEN.matrixLayerAttr(_.assign({job:job,layer:v.name},v.attr));
})
}
return
a
},
true
)?
"ODB"
:
res
.
type
return {
sortNames:sortNames
}
return
res
}
function
getFileInfo
(
props
){
var
inputConfig
=
props
.
inputConfig
,
path
=
props
.
path
,
files
=
props
.
files
var
fileInfo
=
files
.
reduce
(
function
(
a
,
b
){
if
(
inputConfig
.
files
.
indexOf
(
b
.
suffix
)
>=
0
){
a
.
push
({
name
:
b
.
name
,
baseName
:
b
.
baseName
,
completeBaseName
:
b
.
completeBaseName
,
completeSuffix
:
b
.
completeSuffix
,
path
:
b
.
path
,
suffix
:
b
.
suffix
function setDrill(props){ // 设置钻孔
var job = props.job
var matrix = props.matrix
// 获取所有的钻孔层
var drillLayer =matrix.filter(function(v){
return v.attr.type == "
drill
" && v.attr.context == "
board
"
})
// 获取所有single层
var signalLayer =matrix.filter(function(v){
return v.attr.type == "
signal
" && v.attr.context == "
board
"
})
}
return
a
},[])
return
fileInfo
}
function
importJob
(
props
,
delSameJob
){
var
name
=
props
.
name
if
(
GEN
.
isJobExists
({
job
:
name
}))
{
if
(
/^yes$/ig
.
test
(
delSameJob
))
{
if
(
GEN
.
isJobOpen
({
job
:
name
})){
GEN
.
closeJob
({
job
:
name
});
}
GEN
.
deleteJob
({
job
:
name
});
var layerCount = GEN.getLayerCount({job:job})
// findSignal 根据传入的数字找到对应的signal层 如 1 => top ; 2 => layer_2
function findSignal(num){
return signalLayer[Number(num-1)].name
}
function doDrill(drills){ // 分析钻孔层
return drills.map(function(v){
if(v == "
drill
" || v=="
rout
"){
return {start:findSignal[1], end:findSignal[layerCount], layer:v.name}
} else {
var tmp = /(
\
d+)-(
\
d+)/ig.exec(v.tl_name);
if(tmp){
var start = findSignal(tmp[1]);
var end = findSignal(tmp[2]);
return {start:start, end:end, layer:v.name}
} else {
return 0;
}
else
{
return
"job "
+
name
+
" exist"
;
}
})
}
GEN
.
importJob
(
props
);
var drillSetList = doDrill(drillLayer); // 分析得到钻孔设置结果
drillSetList = drillSetList.filter(function(v){return v!==0})
drillSetList.forEach(function(v){
GEN.matrixLayerDrill({job:job,layer:v.layer,start:v.start ,end:v.end})
})
}
function
mergeJob
(
props
){
var
odb
=
props
.
odb
var
job
=
props
.
job
var
fileInfo
=
props
.
fileInfo
var
arrJobName
=
odb
.
jobNameRule
.
replace
(
"(job)"
,
job
)
var
jobInfo
=
fileInfo
.
filter
(
function
(
v
){
return
v
.
baseName
==
job
})[
0
]
var
arrJobInfo
=
fileInfo
.
filter
(
function
(
v
){
return
v
.
baseName
==
arrJobName
})[
0
]
if
(
!
jobInfo
){
return
"file error"
}
if
(
!
arrJobInfo
){
return
"file error"
}
var
jobInfos
=
[
jobInfo
,
arrJobInfo
]
for
(
var
i
=
0
;
i
<
jobInfos
.
length
;
i
++
){
var
err
=
importJob
({
name
:
jobInfos
[
i
].
baseName
,
db
:
odb
.
db
,
path
:
jobInfos
[
i
].
path
},
props
.
delSameJob
)
if
(
err
){
return
err
}
}
// 合并操作
jobInfos
.
forEach
(
function
(
v
){
GEN
.
openJob
({
job
:
v
.
baseName
})})
GEN
.
copyStep
({
source_job
:
arrJobInfo
.
baseName
,
source_name
:
odb
.
arrStep
,
dest_job
:
jobInfo
.
baseName
,
dest_name
:
odb
.
arrStep
,
});
GEN
.
closeJob
({
job
:
arrJobInfo
.
baseName
});
GEN
.
deleteJob
({
job
:
arrJobInfo
.
baseName
});
}
function
importGerber
(
props
){
var
fileInfo
=
props
.
fileInfo
var
gerber
=
props
.
gerber
function reName(props) { // 改名 par{job:要改名的料号, rule: {要改名的规则}
var job = props.job
var
step
=
props
.
step
var
gerberFiles
=
fileInfo
.
filter
(
function
(
file
){
return
gerber
.
gerberConfig
.
hasOwnProperty
(
file
.
suffix
)})
var
gerberInfo
=
gerberFiles
.
map
(
function
(
item
){
var
gerberConfig
=
gerber
.
gerberConfig
[
item
.
suffix
]
||
{}
var
gerberItem
=
{
layer
:
item
.
name
.
toLowerCase
(),
path
:
item
.
path
,
format
:
gerber
.
format
[
item
.
suffix
]
||
"Excellon2"
,
job
:
job
,
step
:
step
}
for
(
var
key
in
gerberConfig
)
{
gerberItem
[
key
]
=
gerberConfig
[
key
]
}
return
gerberItem
var matrix = props.matrix
var cfg = props.cfg
matrix = matrix.filter(function(v){return v.name != v.new_name})
var rename_list = matrix.map(function(item){
var new_name;
var tl_name = item.tl_name
var rule = item.rule
if(rule === tl_name){
new_name = item.new_name
} else {
var reg = new RegExp(rule,"
ig
")
var tmp = reg.exec(tl_name)
if(!tmp){return undefined}
var replaceArr = tmp.slice(1)
new_name = item.new_name
var params = {}
for(var i = 0; i<replaceArr.length;i++){
params["
$
"+(i+1)] = replaceArr[i]
}
replaceArr.forEach(function(v,i){
tl_name = tl_name.replace("
(
$
"+(i+1)+"
)
",v)
})
// 创建料号和step
GEN
.
createJob
({
name
:
job
,
db
:
gerber
.
db
})
GEN
.
createStep
({
job
:
job
,
name
:
step
})
// 分析geber配置
GEN
.
COM
(
"input_manual_reset"
)
gerberInfo
.
forEach
(
function
(
v
){
GEN
.
COM
(
"input_manual_set"
,
v
)
new_name = replaceTlName(new_name)
function replaceTlName(name){
var tmp = /(
\
([^)]*
\
))/ig.exec(name)
if(!tmp){ return name }
var param_arr = tmp[1].match(/
\
$
\
d+/ig)
var newname = tmp[1]
param_arr.forEach(function(v){
newname = newname.replace(new RegExp("
\\
"+v,"
ig
"), params[v])
})
GEN
.
COM
(
"input_manual"
)
}
/*
{
"def": {
"step": "pcs",
"ODB": {
"db": "genesis",
"files": ["tgz"]
},
"Gerber": {
"db": "genesis",
"files": ["drl", "art"],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Excellon2",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
}
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
},
"ats": {
"path": "C:/Users/Administrator/Desktop/Customer_1",
"step": "cad",
"ODB": {
"db": "genesis",
"files": ["tgz"],
"arrStep": "stp",
"isMerge": "yes",
"jobNameRule": "(job)-a"
},
"Gerber": {
"db": "genesis",
"files": ["drd", "drl", "phd", "phl"],
"editFile": [{
"filter": "drd",
"callback": "(function(){ return function(props){
var fs=props.fs,nowFile=props.nowFile,srcFiles=props.srcFiles;
var srcFile = srcFiles.filter(function(v){return v.name == nowFile.name})[0];
var str = fs.readFile(srcFile.path).replace(/:/g,'');
fs.writeFile(nowFile.path,str.match(/T\\d+|G\\d+|X\\d+\\.\\d+Y\\d+\\.\\d+/ig).join('\\n'));
}})()"
}],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Wheel",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
},
"gerberConfig": {
"drd": {
"data_type":"ascii",
"units":"mm",
"coordinates":"absolute",
"zeroes":"leading",
"nf1":3,
"nf2":0,
"decimal":"yes",
"separator":"nl",
"tool_units":"mm",
"nf_comp":0,
"multiplier":1,
"text_line_width":0.0024,
"signed_coords":"no",
"break_sr":"yes",
"drill_only":"no",
"merge_by_rule":"no",
"threshold":200,
"resolution":3
},
"phd": {
"data_type":"ascii",
"units":"mm",
"coordinates":"absolute",
"zeroes":"leading",
"nf1":3,
"nf2":4,
"decimal":"no",
"separator":"*",
"tool_units":"inch",
"nf_comp":0,
"multiplier":1,
"text_line_width":0.0024,
"signed_coords":"no",
"break_sr":"yes",
"drill_only":"no",
"merge_by_rule":"no",
"threshold":200,
"resolution":3
newname = name.replace(tmp[1],eval(newname))
return replaceTlName(newname)
}
}
return {
orig_name: item.name,
new_name: new_name
}
})
rename_list = rename_list.filter(function(v){
var flag = true
if(!v){flag = false}
if(!v.orig_name || !v.new_name ){flag = false}
return flag
})
rename_list.forEach(function(v){
if(v.orig_name !== v.new_name){
GEN.renameLayer({job:job,layer:v.orig_name,new_name:v.new_name})
}
});
}
*/
/*
{
"ats": {
"ODB": {
"db": "genesis",
"files": ["tgz"],
"arrStep": "stp",
"isMerge": "yes",
"jobNameRule": "(job)-a"
},
"path": "C:/Users/Administrator/Desktop/Customer_1",
"step": "cad",
"Gerber": {
"db": "genesis",
"files": ["drd", "drl", "phd", "phl"],
"format": {
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Wheel",
"phd": "Gerber274x",
"phl": "Ascii"
},
"editFile": [{
"filter": "drd",
"callback": "(function(){ return function(props){ var fs=props.fs,nowFile=props.nowFile,srcFiles=props.srcFiles; var srcFile = srcFiles.filter(function(v){return v.name == nowFile.name})[0]; var str = fs.readFile(srcFile.path).replace(/:/g,''); fs.writeFile(nowFile.path,str.match(/T\\d+|G\\d+|X\\d+\\.\\d+Y\\d+\\.\\d+/ig).join('\\n')); }})()"
}],
"gerberConfig": {
"drd": {
"nf1": 3,
"nf2": 0,
"units": "mm",
"zeroes": "leading",
"decimal": "yes",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "nl",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "mm",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
},
"phd": {
"nf1": 3,
"nf2": 4,
"units": "mm",
"zeroes": "leading",
"decimal": "no",
"nf_comp": 0,
"break_sr": "yes",
"data_type": "ascii",
"separator": "*",
"threshold": 200,
"drill_only": "no",
"multiplier": 1,
"resolution": 3,
"tool_units": "inch",
"coordinates": "absolute",
"merge_by_rule": "no",
"signed_coords": "no",
"text_line_width": 0.0024
}
}
function mergeDrill(props){ // 合并钻孔
var newdrills = []
var job = props.job;
var step = GEN.getStepList({job:job})[0];
var maxDrill = {name:"",value:0};
function getDrl(str){
var num = /(
\
d+)-(
\
d+)/ig.exec(str); // 匹配出 num-num
var tmp = [];
for(var i = Number(num[1]);i<num[2];i++){
if(i == 1){
maxDrill = Number(num[2]) > maxDrill.value? {name:str,value:Number(num[2])} : maxDrill;
}
tmp.push("
L
"+i+"
-
"+(i+1));
}
return tmp;
}
},
"def": {
"ODB":
{
"db": "genesis",
"files": ["tgz"]
},
"step": "pcs",
"Gerber":
{
"db": "genesis",
"files": ["drl", "art"],
"format":
{
"art": "Gerber274x",
"drd": "Excellon1",
"drl": "Excellon2",
"ipc": "IPC356",
"phd": "Gerber274x",
"phl": "Ascii"
var matrix = GEN.getMatrix({job:job});
GEN.openStep({job : job,name:step});
for(var key in matrix)
{
var val = matrix[key];
if(val.layer_type == "
drill
"){
var mergeTo = getDrl(val.name) // 要合并到的地方
mergeTo.forEach(function(layerName){
if(GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}) && newdrills.indexOf(layerName.toLowerCase()) < 0)
{
GEN.deleteLayer({job:job, layer:layerName.toLowerCase()})
}
if(!GEN.isLayerExists({job : job ,layer:layerName.toLowerCase()}))
{
GEN.createLayer({job:job,layer:layerName.toLowerCase(),conext:'board',type:val.layer_type});
newdrills.push(layerName.toLowerCase())
}
GEN.workLayer({name:layerName.toLowerCase(),display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:val.name,dest_layer:layerName.toLowerCase()});
})
}
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
}
// 合并到maxDrill独立合并
GEN.createLayer({job:job,layer:"
b1
-
"+maxDrill.value,conext:'board',type:'drill'});
GEN.workLayer({name:"
b1
-
"+maxDrill.value,display_number:1,clear_before:'yes'});
GEN.copyLayer({source_job:job ,mode:'append',source_step:step,source_layer:maxDrill.name,dest_layer:"
b1
-
"+maxDrill.value});
GEN.affectedLayer({affected:"
no
",mode:"
all
"});
GEN.closeStep();
return this;
}
*/
\ No newline at end of file
This diff is collapsed.
Click to expand it.
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