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
Apr 14, 2020
by
Scott Sun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
s
parent
91f888e4
Changes
4
Hide 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,55 @@ var config = {
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"Excellon
1_1
"
:
{
"nf1"
:
3
,
"nf2"
:
4
,
"units"
:
"
mm
"
,
"Excellon
2_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,48 +127,501 @@ var config = {
"text_line_width"
:
0.0024
}
},
"cust"
:
{
"
c1
"
:
{
"path"
:
"C:/Users/Administrator/Desktop/Customer_
1
"
,
"cust
omer
"
:
{
"
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"
:
""
,
// 文件正则 func
"type"
:
"Gerber274"
,
// 格式 odb gerber
"format"
:
"Gerber274_1"
"valid"
:
function
(
props
){
var
file
=
props
.
file
;
return
/.+
\.
ipc$/ig
.
test
(
file
.
name
)
},
"type"
:
"IPC356"
,
"format"
:
"IPC356_1"
},
{
"valid"
:
""
,
// 文件正则 func
"type"
:
"Excellon1"
,
// 格式 odb gerber
"format"
:
"Excellon1_1"
,
"rename"
:
{}
"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
}
}
}
}
],
"tlname"
:
[
{
"orig_name"
:
"pasttop.art"
,
"tlname"
:
"past_top"
},
{
"orig_name"
:
"pleg.art"
,
"tlname"
:
"silk_top"
},
{
"orig_name"
:
"soldtop.art"
,
"tlname"
:
"sm_top"
},
{
"orig_name"
:
"art(
\\
d+)
\\
.art"
,
"tlname"
:
"layer_(1)"
},
{
"orig_name"
:
"soldbotm.art"
,
"tlname"
:
"sm_botm"
},
{
"orig_name"
:
"sleg.art"
,
"tlname"
:
"silk_bot"
},
{
"orig_name"
:
"pastbotm.art"
,
"tlname"
:
"past_botm"
},
{
"orig_name"
:
"multipack.art"
,
"tlname"
:
"array"
},
{
"orig_name"
:
"outline.art"
,
"tlname"
:
"outline"
},
{
"orig_name"
:
"fab.art"
,
"tlname"
:
"fab.art"
},
{
"orig_name"
:
"top-enig"
,
"tlname"
:
"top-enig"
},
{
"orig_name"
:
"bot-enig"
,
"tlname"
:
"bot-enig"
},
{
"orig_name"
:
"fab_page2"
,
"tlname"
:
"fab_page2"
}
"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"
}
]
}
},
"sort_rename"
:
[
{
"tlname"
:
""
,
"newname"
:
""
}
// newname 里支持特殊变量
]
"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",
"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
}
}
}
}
],
"tlname": [
{"orig_name" : "pasttop.art", "tlname" : "past_top" },
{"orig_name" : "pleg.art", "tlname" : "silk_top" },
{"orig_name" : "soldtop.art", "tlname" : "sm_top" },
{"orig_name" : "art(\\d+)\\.art", "tlname" : "layer_(1)"},
{"orig_name" : "soldbotm.art", "tlname" : "sm_botm" },
{"orig_name" : "sleg.art", "tlname" : "silk_bot" },
{"orig_name" : "pastbotm.art", "tlname" : "past_botm" },
{"orig_name" : "multipack.art", "tlname" : "array" },
{"orig_name" : "outline.art", "tlname" : "outline" },
{"orig_name" : "fab.art", "tlname" : "fab.art" },
{"orig_name" : "top-enig", "tlname" : "top-enig" },
{"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"
}
]
},
"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
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
);
}
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;
}
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
})
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
)
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
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
(
!
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
})
// 料号验证
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
}
GUI
.
msg
(
"end"
)
// 改名
err
=
reName
({
job
:
job
,
matrix
:
after_sort_matrix
,
cfg
:
format_cfg
})
if
(
err
){
throw
err
}
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
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
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
)
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
})
})
}
return
a
},[])
if
(
cfg
.
Gerber
){
res
.
type
=
cfg
.
Gerber
.
files
.
reduce
(
function
(
a
,
b
){
if
(
res
.
fileSuffix
.
indexOf
(
b
)
<
0
){
a
=
false
}
return
a
},
true
)?
"Gerber"
:
undefined
}
if
(
cfg
.
ODB
){
res
.
type
=
cfg
.
ODB
.
files
.
reduce
(
function
(
a
,
b
){
if
(
res
.
fileSuffix
.
indexOf
(
b
)
<
0
){
a
=
false
})
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
]
}
return
a
},
true
)?
"ODB"
:
res
.
type
}
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
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
a
},[])
return
fileInfo
})
return res
}
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
});
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'})
}
else
{
return
"job "
+
name
+
" exist"
;
})
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 })
}
}
GEN
.
importJob
(
props
);
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
mergeJob
(
props
){
var
odb
=
props
.
odb
function setDrill(props){ // 设置钻孔
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
}
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
}
// 合并操作
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 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
importGerber
(
props
){
var
fileInfo
=
props
.
fileInfo
var
gerber
=
props
.
gerber
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
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)
}
}
for
(
var
key
in
gerberConfig
)
{
gerberItem
[
key
]
=
gerberConfig
[
key
]
return {
orig_name: item.name,
new_name: new_name
}
return
gerberItem
})
// 创建料号和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
)
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
})
GEN
.
COM
(
"input_manual"
)
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})
}
});
}
/*
{
"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"
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;
}
},
"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
}
}
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;
}
*/
/*
{
"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
}
}
}
},
"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"
}
},
"autoSave": "yes",
"isDelComp": "yes",
"delSameJob": "yes"
}
}
*/
\ No newline at end of file
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