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
1dbd449a
Commit
1dbd449a
authored
Apr 22, 2020
by
Scott Sun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
v20200422-rc1
parent
e4ff3359
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
3994 additions
and
918 deletions
+3994
-918
ATS_AIM_data_input.js
ats/input/ATS_AIM_data_input.js
+317
-0
ATS_AIM_input_data.js
ats/input/ATS_AIM_input_data.js
+14
-12
ATS_AIM_data_format.js
ats/rename/ATS_AIM_data_format.js
+410
-0
config_ats.js
config_ats.js
+7
-7
JTG_NET_set_drill_attribute_aim.js
jtg/JTG_NET_set_drill_attribute_aim.js
+273
-0
JTG_ORG_backup_layers_aim.js
jtg/JTG_ORG_backup_layers_aim.js
+166
-0
JTG_ORG_create_outline_aim.js
jtg/JTG_ORG_create_outline_aim.js
+187
-0
JTG_ORG_delete_profile_aim.js
jtg/JTG_ORG_delete_profile_aim.js
+154
-0
JTG_ORG_input_data_aim.js
jtg/JTG_ORG_input_data_aim.js
+339
-0
JTG_ORG_set_origin_aim.js
jtg/JTG_ORG_set_origin_aim.js
+156
-0
JTG_PUB_auto_save_job_aim.js
jtg/JTG_PUB_auto_save_job_aim.js
+93
-0
JTG_PUB_copy_step_aim.js
jtg/JTG_PUB_copy_step_aim.js
+140
-0
ATS_AIM_customer_data_analysis copy.js
test/ATS_AIM_customer_data_analysis copy.js
+568
-1
ATS_AIM_customer_data_analysis.js
test/ATS_AIM_customer_data_analysis.js
+943
-304
mytest.js
test/mytest.js
+225
-490
test.js
test/test.js
+2
-104
No files found.
ats/input/ATS_AIM_data_input.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'path',
title : '资料路径',
type : 'LineEdit',
property : {tool_tip : '存放所有料号的文件夹路径,不需要进入到料号文件夹内'},
},
{
name : 'customer',
title : '客户配置',
type : 'ComboBox',
property : {
item_list:['customer_1','customer_2','new_data'],
tool_tip:'客户代码'
}
},
{
name : 'db',
title : '料号db',
type : 'LineEdit',
property : {tool_tip : '料号db,默认是genesis'},
},
{
name : 'config_path',
title : '配置地址',
type : 'LineEdit',
property : {tool_tip : '配置的路径'},
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 客户数据导入 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 料号 和 客户配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// 引入模块 包
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
;
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
if
(
!
par
.
hasOwnProperty
(
"customer"
)
||
par
.
customer
==
""
){
throw
"未填写配置"
};
if
(
!
par
.
hasOwnProperty
(
"path"
)
||
par
.
path
==
""
){
throw
"未填写路径"
};
if
(
!
par
.
hasOwnProperty
(
"config_path"
)
||
par
.
config_path
==
""
){
console
.
log
(
"========================cfg"
);
par
.
config_path
=
"cam/input_data"
};
if
(
!
par
.
hasOwnProperty
(
"db"
)
||
par
.
db
==
""
){
console
.
log
(
"========================db"
);
par
.
db
=
"genesis"
};
par
.
customer
=
par
.
customer
[
0
].
toUpperCase
()
+
par
.
customer
.
slice
(
1
).
toLowerCase
()
var
cfg
=
db
.
query
(
""
,
function
(
q
){
return
q
.
selectValue
({
table
:
'pub_conf'
,
field
:
'text_data'
,
where
:{
path
:
par
.
config_path
}
})
});
if
(
!
cfg
||
cfg
==
""
){
throw
"cfg can not find"
}
var
config
=
eval
(
cfg
);
if
(
!
config
.
hasOwnProperty
(
"customer"
)){
throw
"config error"
}
var
job
=
Job
;
if
(
_
.
isEmpty
(
job
))
throw
"没有传入料号名!"
;
job
=
job
.
toLowerCase
()
// 如果genesis已经存在这个料号
err
=
delSameJob
({
job
:
job
,
delSame
:
config
.
delSameJob
});
if
(
err
){
throw
err
};
var
custCfg
=
config
.
customer
[
par
.
customer
]
if
(
!
custCfg
){
throw
"config error"
}
custCfg
.
db
=
par
.
db
||
custCfg
.
db
var
step
=
custCfg
.
step
.
toLowerCase
()
// 获取路径下文件信息
var
path
=
par
.
path
||
custCfg
.
path
var
pathInfo
=
fs
.
listDir
(
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
})
if
(
jobInfo
.
data
.
length
==
0
){
throw
"file error"
}
var
importOk
=
false
;
// 是否成功导入
if
(
/odb/ig
.
test
(
jobInfo
.
type
)){
// odb导入
if
(
jobInfo
.
data
.
length
==
1
){
// 只分析到一个tgz文件 直接导入
var
err
=
importJob
({
name
:
job
,
db
:
custCfg
.
db
,
path
:
jobInfo
.
data
[
0
].
file
.
path
},
config
.
delSameJob
)
if
(
err
){
throw
err
}
}
else
{
// 多个tgz文件 说明需要合并
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
]
var
arr_step
;
var
steplist
=
GEN
.
getStepList
({
job
:
arr_job
.
file
.
baseName
})
if
(
steplist
.
indexOf
(
arr_job
.
format
.
arrStep
)
<
0
){
arr_step
=
steplist
[
0
]
}
else
{
arr_step
=
arr_job
.
format
.
arrStep
}
GEN
.
openJob
({
job
:
job
});
GEN
.
openJob
({
job
:
arr_job
.
file
.
baseName
});
GEN
.
copyStep
({
// 合并
source_job
:
arr_job
.
file
.
baseName
,
source_name
:
arr_step
,
dest_job
:
job
,
dest_name
:
arr_step
,
});
GEN
.
closeJob
({
job
:
arr_job
.
file
.
baseName
});
GEN
.
deleteJob
({
job
:
arr_job
.
file
.
baseName
});
// 合并后 删除array的料号
}
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
){
// 如果有comp层 删除
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
})
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
console
.
log
(
"====================================>error"
);
console
.
log
(
_
.
toString
(
e
));
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
function
delSameJob
(
props
){
var
job
=
props
.
job
var
delSame
=
props
.
delSame
console
.
log
(
"======================>delsame:"
+
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
);
}
ats/input/ATS_AIM_input_data.js
View file @
1dbd449a
...
@@ -14,8 +14,15 @@ PARAMETER:
...
@@ -14,8 +14,15 @@ PARAMETER:
{
{
name : 'customer',
name : 'customer',
title : '客户配置',
title : '客户配置',
type : 'LineEdit',
type : 'RadioBox',
property : {tool_tip : '客户配置'},
property : {
item_list:[
{name:'customer_1',text:'customer_1'},
{name:'customer_2',text:'customer_2'},
{name:'new_data',text:'new_data'},
],
tool_tip:'客户代码'
}
},
},
{
{
name : 'config_path',
name : 'config_path',
...
@@ -47,8 +54,6 @@ PARAMETER:
...
@@ -47,8 +54,6 @@ PARAMETER:
// 引入模块 包
// 引入模块 包
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
console
.
log
(
"=============================================>input_start"
);
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
_
=
require
(
'lodash'
);
...
@@ -73,15 +78,12 @@ var PAR = {};
...
@@ -73,15 +78,12 @@ var PAR = {};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
}
if
(
!
$
.
hasOwnProperty
(
'config_path'
)){
PAR
.
config_path
=
"cam/input_data"
}
try
{
try
{
var
par
=
PAR
;
var
par
=
PAR
;
console
.
log
(
par
);
if
(
!
par
.
hasOwnProperty
(
"customer"
)){
throw
"未填写配置"
};
if
(
!
par
.
hasOwnProperty
(
"customer"
)){
throw
"未填写配置"
};
if
(
!
par
.
hasOwnProperty
(
"config_path"
)){
par
.
config_path
=
"cam/input_data"
};
par
.
customer
=
par
.
customer
[
0
].
toUpperCase
()
+
par
.
customer
.
slice
(
1
).
toLowerCase
()
par
.
customer
=
par
.
customer
[
0
].
toUpperCase
()
+
par
.
customer
.
slice
(
1
).
toLowerCase
()
var
cfg
=
db
.
query
(
""
,
function
(
q
){
var
cfg
=
db
.
query
(
""
,
function
(
q
){
return
q
.
selectValue
({
return
q
.
selectValue
({
...
...
ats/rename/ATS_AIM_data_format.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'customer',
title : '客户配置',
type : 'ComboBox',
property : {
item_list:['customer_1','customer_2','new_data'],
tool_tip:'客户代码'
}
},
{
name : 'config_path',
title : '配置地址',
type : 'LineEdit',
property : {tool_tip : '配置的路径'},
}
]
VERSION_HISTORY:
V1.00 2020-04-17 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 数据标准化 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 客户配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// 引入模块 包
console
.
log
(
"==============================================>data_format"
)
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
mode
=
"use"
// develop
var
par
=
PAR
;
if
(
!
par
.
hasOwnProperty
(
"customer"
)
||
par
.
customer
==
""
){
throw
"未填写配置"
};
if
(
!
par
.
hasOwnProperty
(
"config_path"
)
||
par
.
config_path
==
""
){
console
.
log
(
"========================cfg"
);
par
.
config_path
=
"cam/input_data"
};
par
.
customer
=
par
.
customer
[
0
].
toUpperCase
()
+
par
.
customer
.
slice
(
1
).
toLowerCase
()
var
cfg
=
db
.
query
(
""
,
function
(
q
){
return
q
.
selectValue
({
table
:
'pub_conf'
,
field
:
'text_data'
,
where
:{
path
:
par
.
config_path
}
})
});
if
(
!
cfg
||
cfg
==
""
){
throw
"cfg can not find"
}
var
config
=
eval
(
cfg
)
var
job
=
Job
;
if
(
_
.
isEmpty
(
job
))
throw
"没有传入料号名!"
;
job
=
job
.
toLowerCase
()
var
custCfg
=
config
.
customer
[
par
.
customer
]
// 获取客户配置
if
(
!
custCfg
){
throw
"config error"
}
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"
});
// if(config.hasOwnProperty("merge_drill")){ // todo
// mergeDrill({job:job})
// }
// 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
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
}
// end
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
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
})
})
}
})
var
res
=
Object
.
keys
(
matrix
).
map
(
function
(
key
){
// 将matrix信息添加tl_name 如果没有tl_name 就返回原信息
var
val
=
matrix
[
key
]
if
(
val
.
hasOwnProperty
(
"tl_name"
)){
delete
val
.
tl_name
}
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.type == "
rout
") && 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.name == "
drill
" || v.name=="
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+)
\
.drl/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
" && /(
\
d+)-(
\
d+)
\
.drl/ig.test(val.name)){
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()});
})
}
}
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.clearLayers();
GEN.closeStep();
}
config_ats.js
View file @
1dbd449a
...
@@ -150,7 +150,7 @@
...
@@ -150,7 +150,7 @@
"customer"
:
{
"customer"
:
{
"Customer_1"
:
{
"Customer_1"
:
{
"path"
:
"/opt/resource/customer_1"
,
"path"
:
"/opt/resource/customer_1"
,
"db"
:
"
server_db
"
,
"db"
:
"
genesis
"
,
"step"
:
"cad"
,
"step"
:
"cad"
,
"rules"
:
[
"rules"
:
[
{
{
...
@@ -208,7 +208,7 @@
...
@@ -208,7 +208,7 @@
},
},
"Customer_2"
:
{
"Customer_2"
:
{
"path"
:
"/opt/resource/customer_2"
,
"path"
:
"/opt/resource/customer_2"
,
"db"
:
"
server_db
"
,
"db"
:
"
genesis
"
,
"step"
:
"cad"
,
"step"
:
"cad"
,
"rules"
:
[
"rules"
:
[
{
{
...
@@ -348,7 +348,7 @@
...
@@ -348,7 +348,7 @@
},
},
"New_data"
:
{
"New_data"
:
{
"path"
:
"/opt/resource/new_data"
,
"path"
:
"/opt/resource/new_data"
,
"db"
:
"
server_db
"
,
"db"
:
"
genesis
"
,
"step"
:
"cad"
,
"step"
:
"cad"
,
"rules"
:
[
"rules"
:
[
{
{
...
@@ -455,18 +455,18 @@
...
@@ -455,18 +455,18 @@
{
"orig_name"
:
"pleg.art"
,
"tl_name"
:
"silk_top"
},
{
"orig_name"
:
"pleg.art"
,
"tl_name"
:
"silk_top"
},
{
"orig_name"
:
"soldtop.art"
,
"tl_name"
:
"sm_top"
},
{
"orig_name"
:
"soldtop.art"
,
"tl_name"
:
"sm_top"
},
{
"orig_name"
:
[
"top.art"
,
"^top$"
],
"tl_name"
:
"top"
},
{
"orig_name"
:
[
"top.art"
,
"^top$"
],
"tl_name"
:
"top"
},
{
"orig_name"
:
[
"
art
(
\\
d+)
\\
.art"
,
"layer_(
\\
d+)"
],
"tl_name"
:
"l_($1)"
},
{
"orig_name"
:
[
"
inner_
(
\\
d+)
\\
.art"
,
"layer_(
\\
d+)"
],
"tl_name"
:
"l_($1)"
},
{
"orig_name"
:
[
"bottom.art"
,
"^bottom$"
],
"tl_name"
:
"bottom"
},
{
"orig_name"
:
[
"bottom.art"
,
"^bottom$"
],
"tl_name"
:
"bottom"
},
{
"orig_name"
:
"soldbotm.art"
,
"tl_name"
:
"sm_botm"
},
{
"orig_name"
:
"soldbotm.art"
,
"tl_name"
:
"sm_botm"
},
{
"orig_name"
:
"sleg.art"
,
"tl_name"
:
"silk_bot"
},
{
"orig_name"
:
"sleg.art"
,
"tl_name"
:
"silk_bot"
},
{
"orig_name"
:
"pastbotm.art"
,
"tl_name"
:
"past_botm"
},
{
"orig_name"
:
"pastbotm.art"
,
"tl_name"
:
"past_botm"
},
{
"orig_name"
:
"multipack.art"
,
"tl_name"
:
"array"
},
{
"orig_name"
:
"multipack.art"
,
"tl_name"
:
"array"
},
{
"orig_name"
:
"outline.art"
,
"tl_name"
:
"outline"
},
{
"orig_name"
:
[
"outline.art"
,
"outline"
]
,
"tl_name"
:
"outline"
},
{
"orig_name"
:
"fab.art"
,
"tl_name"
:
"fab"
},
{
"orig_name"
:
[
"fab.art"
,
"fab"
]
,
"tl_name"
:
"fab"
},
{
"orig_name"
:
"top-enig"
,
"tl_name"
:
"top-enig"
},
{
"orig_name"
:
"top-enig"
,
"tl_name"
:
"top-enig"
},
{
"orig_name"
:
"bot-enig"
,
"tl_name"
:
"bot-enig"
},
{
"orig_name"
:
"bot-enig"
,
"tl_name"
:
"bot-enig"
},
{
"orig_name"
:
"fab_page2"
,
"tl_name"
:
"fab_page2"
},
{
"orig_name"
:
"fab_page2"
,
"tl_name"
:
"fab_page2"
},
{
"orig_name"
:
[
"(
\\
d+)-(
\\
d+)
$
"
,
"d(
\\
d+)-(
\\
d+)"
],
"tl_name"
:
"d_($1)-($2)"
}
{
"orig_name"
:
[
"(
\\
d+)-(
\\
d+)
-laser
\\
.drl
"
,
"d(
\\
d+)-(
\\
d+)"
],
"tl_name"
:
"d_($1)-($2)"
}
]
]
}
}
},
},
...
...
jtg/JTG_NET_set_drill_attribute_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'max_via_size',
title : '最大via孔径',
type : 'LineEdit',
property : {tool_tip : '最大via孔径,默认是0.9mm'},
},
{
name : 'min_via_num',
title : '最少via孔数',
type : 'LineEdit',
property : {tool_tip : '最少via孔数,默认是100'},
},
{
name : 'equidistant_tolerance',
title : '等间距公差',
type : 'LineEdit',
property : {tool_tip : '等间距公差,默认是0.005mm'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 设置孔属性 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>set drill"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
var
default_par
=
{
max_via_size
:
"0.9mm"
,
min_via_num
:
"100"
,
equidistant_tolerance
:
"0.005mm"
,
auto_save
:
"No"
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
var
max_via_size
=
parseFloat
(
par
.
max_via_size
);
var
equidistant_tolerance
=
parseFloat
(
par
.
equidistant_tolerance
);
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})
}
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// 通过matrix获取board属性的钻孔层
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
dirll_layer
=
Object
.
keys
(
matrix
).
reduce
(
function
(
a
,
b
){
if
(
matrix
[
b
].
context
==
"board"
&&
matrix
[
b
].
layer_type
==
"drill"
){
a
.
push
(
b
)
}
return
a
},[])
var
stepList
=
GEN
.
getStepList
({
job
:
job
})
stepList
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
})
dirll_layer
.
forEach
(
function
(
layer
){
// 逐层设置钻孔工作层
GEN
.
workLayer
({
name
:
layer
,
display_number
:
2
,
clear_before
:
'yes'
})
// 分析via孔:排除超过max_via_size的孔径的孔,排除数量少于min_via_num数量的钻孔,排除存在等间距equidistant_tolerance的钻孔
// 排除超过max_via_size的孔径的孔
var
layerSymsHist
=
GEN
.
getLayerSymsHist
({
job
:
job
,
step
:
step
,
layer
:
layer
});
var
via_symbol
=
Object
.
keys
(
layerSymsHist
).
map
(
function
(
v
){
return
layerSymsHist
[
v
]})
via_symbol
=
via_symbol
.
filter
(
function
(
item
){
return
Number
(
item
.
size
)
<=
max_via_size
})
// 排除少于min_via_num数量的钻孔
via_symbol
=
via_symbol
.
filter
(
function
(
item
){
return
item
.
pad
>=
Number
(
par
.
min_via_num
)
})
if
(
via_symbol
.
length
){
// 如果via_symbol存在
GEN
.
selClearFeature
()
GEN
.
selectByFilter
({
feat_types
:
"pad"
,
include_syms
:
via_symbol
.
map
(
function
(
v
){
return
v
.
symbol
}).
join
(
","
)
})
// 将选中的复制到辅助层
var
layer_tmp
=
layer
+
"_tmp"
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
layer_tmp
})){
GEN
.
deleteLayer
({
job
:
job
,
step
:
step
,
layer
:
layer_tmp
})}
GEN
.
selCopyOther
({
dest
:
"layer_name"
,
target_layer
:
layer_tmp
,
invert
:
'no'
})
GEN
.
selClearFeature
();
GEN
.
workLayer
({
name
:
layer_tmp
,
display_number
:
2
,
clear_before
:
'yes'
})
var
ck
=
"tmp_chk"
if
(
GEN
.
isChklistExists
({
job
:
job
,
step
:
step
,
chklist
:
ck
})){
GEN
.
COM
(
"chklist_delete"
,
{
chklist
:
ck
})
}
// 创建并运行
GEN
.
createChklist
({
// 创建checklist
chklist
:
ck
,
items
:
[{
name
:
"viaPitch"
,
nact
:
1
,
action
:
"valor_analysis_signal"
,
erf
:
"S2_conductor_Check"
,
params
:
{
pp_layer
:
".affected"
,
pp_spacing
:
20
,
pp_selected
:
"All"
,
pp_r2c
:
10
,
pp_d2c
:
15
,
pp_sliver
:
8
,
pp_min_pad_overlap
:
5
,
pp_check_missing_pads_for_drills
:
"Yes"
,
pp_use_compensated_rout
:
"Skeleton"
,
pp_sm_spacing
:
"Yes"
,
pp_tests
:
"Spacing"
,
pp_check_missing_pads_for_drills
:
"Yes"
}
}]
})
GEN
.
chklistShow
({
chklist
:
ck
})
GEN
.
affectedLayer
({
affected
:
"yes"
,
layer
:
layer
,
clear_before
:
"yes"
})
GEN
.
chklistRun
({
chklist
:
ck
,
nact
:
1
,
area
:
"profile"
})
var
tmp_layer1
=
"mk_1_"
+
layer_tmp
+
"_pitch"
var
tmp_layer2
=
"ms_1_"
+
layer_tmp
+
"_pitch"
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
tmp_layer1
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
tmp_layer1
})
}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
tmp_layer2
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
tmp_layer2
})
}
GEN
.
COM
(
"chklist_create_lyrs,chklist="
+
ck
+
",severity=3,suffix=pitch"
);
GEN
.
workLayer
({
name
:
tmp_layer2
,
display_number
:
1
,
clear_before
:
'yes'
});
GEN
.
selectByFilter
({
attribute
:[{
attribute
:
".string"
,
text
:
"via_pitch"
}]})
var
tmp_layer2_tmp
=
tmp_layer2
+
"_tmp"
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
tmp_layer2
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
tmp_layer2_tmp
})
}
GEN
.
selCopyOther
({
dest
:
"layer_name"
,
target_layer
:
tmp_layer2_tmp
,
invert
:
'no'
})
GEN
.
selClearFeature
();
GEN
.
workLayer
({
name
:
tmp_layer2_tmp
,
display_number
:
1
,
clear_before
:
'yes'
});
var
symbols_tmp
=
GEN
.
getLayerSymsHist
({
job
:
job
,
layer
:
tmp_layer2_tmp
,
step
:
step
})
// 找出间距 equidistant_tolerance 的
var
equidistant_tolerance_symbol
=
_
.
values
(
symbols_tmp
).
filter
(
function
(
item
){
return
Math
.
abs
(
Number
(
item
.
size
)
-
equidistant_tolerance
)
<
0.000001
})
// 如果有 根据上面找到的 参考选择 删掉 layer_tmp 层里的钻孔
if
(
equidistant_tolerance_symbol
.
length
){
GEN
.
selectByFilter
({
exclude_syms
:
equidistant_tolerance_symbol
.
map
(
function
(
v
){
return
v
.
symbol
}).
join
(
","
)
})
GEN
.
selDelete
()
GEN
.
workLayer
({
name
:
layer_tmp
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selRefFeat
({
layers
:
tmp_layer2_tmp
,
use
:
'filter'
,
mode
:
'touch'
})
GEN
.
selDelete
()
}
// 根据layer_tmp层的钻孔参考选择出 层里面的镭射层
GEN
.
selClearFeature
()
GEN
.
workLayer
({
name
:
layer
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selRefFeat
({
layers
:
layer_tmp
,
use
:
'filter'
,
mode
:
'touch'
})
// 设置选中的via孔属性
GEN
.
selAddAttr
({
attribute
:
'.drill'
,
option
:
'via'
})
GEN
.
selClearFeature
()
// 删除辅助层
var
deleLayers
=
[
tmp_layer1
,
tmp_layer2
,
tmp_layer2_tmp
,
layer_tmp
]
deleLayers
.
forEach
(
function
(
v
){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
v
})
})
}
})
GEN
.
closeStep
()
})
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
jtg/JTG_ORG_backup_layers_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'prefix',
title : '前缀名',
type : 'LineEdit',
property : {tool_tip : '前缀名,默认是org-'},
},
{
name : 'suffix',
title : '后缀名',
type : 'LineEdit',
property : {tool_tip : '后缀名,默认没有'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 备份层 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 前缀后缀 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>备份层"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
var
default_par
=
{
prefix
:
"org-"
,
suffix
:
""
,
auto_save
:
"No"
,
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})
}
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// 通过matrix获取board层
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
board_layers
=
Object
.
keys
(
matrix
).
reduce
(
function
(
a
,
b
){
if
(
matrix
[
b
].
context
==
"board"
){
a
.
push
(
b
)
}
return
a
},[])
board_layers
.
forEach
(
function
(
layer
){
var
new_layer
=
par
.
prefix
+
layer
+
par
.
suffix
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
new_layer
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
new_layer
})
}
GEN
.
matrixAddLayer
({
job
:
job
,
layer
:
new_layer
,
context
:
'misc'
,
type
:
matrix
[
layer
].
layer_type
})
})
var
stepList
=
GEN
.
getStepList
({
job
:
job
})
stepList
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
})
// 逐层备份原稿层,备份名为prefix + 层名 + suffix
board_layers
.
forEach
(
function
(
layer
){
var
new_layer
=
par
.
prefix
+
layer
+
par
.
suffix
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
})
GEN
.
workLayer
({
name
:
layer
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selClearFeature
()
GEN
.
selAllFeat
()
GEN
.
selCopyOther
({
dest
:
"layer_name"
,
target_layer
:
new_layer
})
GEN
.
selClearFeature
()
GEN
.
clearLayers
()
})
GEN
.
closeStep
()
})
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
jtg/JTG_ORG_create_outline_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'ref_outline',
title : '参考层',
type : 'LineEdit',
property : {tool_tip : '参考层,默认是gm1'},
},
{
name : 'outline',
title : '外形层',
type : 'LineEdit',
property : {tool_tip : '外形层,默认是gko'},
},
{
name : 'outline_width',
title : '外形线宽',
type : 'LineEdit',
property : {tool_tip : '外形线宽,默认是0.2mm'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 创建GKO </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 客户配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>create_outline"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
var
default_par
=
{
ref_outline
:
"gm1"
,
outline
:
"gko"
,
outline_width
:
"0.2mm"
,
auto_save
:
"No"
,
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
var
outline_symbol
;
if
(
par
.
outline
==
""
||
par
.
outline
==
undefined
||
par
.
outline
==
null
||
par
.
outline
==
"null"
){
outline_symbol
=
"null"
;
}
else
{
if
(
!
/^
(([^
0
][
0-9
]
+|0
)\.([
0-9
]{1,2})
$
)
|^
([^
0
][
0-9
]
+|0
)
$/ig
.
test
(
par
.
outline_width
)){
throw
"outline_width failed"
}
par
.
outline_width
=
parseFloat
(
par
.
outline_width
)
outline_symbol
=
"r"
+
String
(
par
.
outline_width
*
1000
);
}
var
ref_outline
=
par
.
ref_outline
;
var
outline
=
par
.
outline
;
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})
}
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// 判断参考层(ref_outline)是否存在并不为空
if
(
!
GEN
.
isLayerExists
({
job
:
job
,
layer
:
ref_outline
})){
throw
"ref_outline不存在"
}
var
steplist
=
GEN
.
getStepList
({
job
:
job
})
steplist
.
forEach
(
function
(
step
){
if
(
!
GEN
.
isLayerEmpty
({
job
:
job
,
step
:
step
,
layer
:
ref_outline
})){
// 创建新的外形层(outline)
GEN
.
openStep
({
job
:
job
,
name
:
step
})
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
outline
})){
GEN
.
workLayer
({
name
:
outline
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selDelete
()
}
else
{
GEN
.
createLayer
({
job
:
job
,
layer
:
outline
,
conext
:
"misc"
,
type
:
"document"
})
}
// 将参考层copy到外形层中
GEN
.
selClearFeature
()
GEN
.
workLayer
({
name
:
ref_outline
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selAllFeat
()
GEN
.
selCopyOther
({
dest
:
"layer_name"
,
target_layer
:
outline
})
GEN
.
selClearFeature
()
GEN
.
workLayer
({
name
:
outline
,
display_number
:
2
,
clear_before
:
'yes'
})
if
(
outline_symbol
!=
"null"
){
GEN
.
selChangeSym
({
symbol
:
outline_symbol
})
GEN
.
selClearFeature
()
}
GEN
.
clearLayers
()
GEN
.
closeStep
()
}
})
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
jtg/JTG_ORG_delete_profile_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'cutting_marign',
title : '切除profile外数值',
type : 'LineEdit',
property : {tool_tip : '切除profile外数值,默认是0.2mm'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 删除板外 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 切除值 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>删除板外"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
var
default_par
=
{
cutting_marign
:
"0.2mm"
,
auto_save
:
"No"
,
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
par
.
cutting_marign
=
parseFloat
(
par
.
cutting_marign
)
if
(
!
/^
(([^
0
][
0-9
]
+|0
)\.([
0-9
]{1,2})
$
)
|^
([^
0
][
0-9
]
+|0
)
$/ig
.
test
(
par
.
cutting_marign
)){
throw
"cutting_marign failed"
}
var
cutting_marign_symbol
=
"r"
+
String
(
par
.
cutting_marign
*
1000
)
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})
}
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// 通过matrix获取board层
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
board_layers
=
Object
.
keys
(
matrix
).
reduce
(
function
(
a
,
b
){
if
(
matrix
[
b
].
context
==
"board"
){
a
.
push
(
b
)
}
return
a
},[])
// 影响board层
var
steplist
=
GEN
.
getStepList
({
job
:
job
})
steplist
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
})
GEN
.
clearLayers
()
GEN
.
affectedLayer
({
affected
:
"no"
,
mode
:
"all"
})
GEN
.
affectedLayer
({
affected
:
"yes"
,
layer
:
board_layers
})
// 切除profile以外0.2mm(cutting_marign)物件
GEN
.
selectByFilter
({
include_syms
:
cutting_marign_symbol
,
profile
:
"out"
})
GEN
.
selDelete
()
// ?
GEN
.
closeStep
()
})
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
jtg/JTG_ORG_input_data_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'path',
title : '资料路径',
type : 'LineEdit',
property : {tool_tip : '资料路径'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> input原稿 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 资料路径 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>input原稿"
);
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
fs
=
require
(
"fs"
);
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
if
(
!
$
.
hasOwnProperty
(
'auto_save'
)){
PAR
.
auto_save
=
"no"
}
// drill tool manage
var
drill_toll_manage
=
[]
try
{
var
par
=
PAR
;
var
config
=
{
format
:
{
"Gerber274x_1"
:
{
"nf1"
:
2
,
"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"
:
2
,
"nf2"
:
5
,
"units"
:
"inch"
,
"zeroes"
:
"none"
,
"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
}
},
odb
:
[{
vaild
:
function
(
item
){
return
/
\.
tgz$/ig
.
test
(
item
.
name
)
// 以.tgz结尾的
}
}],
gerber
:
[
{
vaild
:
function
(
item
){
return
/
\.
art$/ig
.
test
(
item
.
name
)
// 以.art结尾的
},
type
:
"Gerber274x"
,
format
:
"Gerber274x_1"
},
{
vaild
:
function
(
item
){
return
/
\.
drl$/ig
.
test
(
item
.
name
)
// 以.drl结尾的
},
type
:
"Excellon2"
,
format
:
"Excellon2_1"
}
]
}
if
(
!
par
.
hasOwnProperty
(
"path"
)){
throw
"缺少资料路径"
}
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查genesis中料号情况,存在则报警退出
if
(
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"已经存在"
}
if
(
par
.
path
[
par
.
path
.
length
-
1
]
!==
"/"
){
par
.
path
=
par
.
path
+
"/"
}
var
path
=
par
.
path
+
Job
// 检查待读入文件路径,路径不存在则报警退出
if
(
!
fs
.
exists
(
path
)){
throw
"路径:"
+
path
+
"不存在"
}
// 检查文件格式,odb++或者gerber274,其中gerber存在一种特殊格式,其钻孔文件需要解析文件信息并更改文件内容才能读入(见特殊钻孔文件说明)
var
inputInfo
=
getJobInfo
({
path
:
path
,
job
:
job
,
config
:
config
})
if
(
inputInfo
.
type
==
"none"
){
throw
"file error"
}
// 读入gerber或者odb++ 判断读入方式
// 读入odb++
if
(
/odb/ig
.
test
(
inputInfo
.
type
)){
importJob
({
db
:
"genesis"
,
path
:
inputInfo
.
data
.
path
,
name
:
job
})
}
// 读入gerber
if
(
/gerber/ig
.
test
(
inputInfo
.
type
)){
// ? 处理特殊钻孔文件
inputInfo
.
data
.
forEach
(
function
(
file
){
if
(
/
\.
drl$/ig
.
test
(
file
.
name
)){
var
backUpName
=
file
.
name
+
".backup"
// 备份
fs
.
copyFile
(
file
.
path
,
file
.
dir
+
"/"
+
backUpName
)
// 读取
var
data
=
fs
.
readFile
(
file
.
path
)
data
=
data
.
split
(
"
\n
"
)
var
head
=
getHead
(
data
)
var
body
=
data
// 解析head
var
headData
=
head
.
filter
(
function
(
v
){
return
/Holesize.+Tolerance.+PLATED/ig
.
test
(
v
)
})
headData
.
map
(
function
(
v
){
var
res
=
{
holesize
:
{},
tolerance
:
{},
attr
:
""
,
unit
:
""
,
quantity
:
0
}
var
holesize_tmp
=
/
(
Holesize.+
)
Tolerance/
.
exec
(
v
)[
1
];
holesize_tmp
=
holesize_tmp
.
split
(
"="
)
res
.
holesize
.
key
=
holesize_tmp
[
0
].
trim
()
res
.
holesize
.
value
=
holesize_tmp
[
1
].
trim
()
var
Tolerance_tmp
=
/
(
Tolerance.
{23})
/
.
exec
(
v
)[
1
];
Tolerance_tmp
=
Tolerance_tmp
.
split
(
"="
)[
1
].
split
(
"/"
)
res
.
tolerance
.
top
=
Tolerance_tmp
[
0
].
trim
()
res
.
tolerance
.
bot
=
Tolerance_tmp
[
1
].
trim
()
res
.
attr
=
/NON_PLATED/ig
.
test
(
v
)
?
"non_plated"
:
"plated"
res
.
unit
=
/MILES/ig
.
test
(
v
)
?
"inch"
:
"mm"
res
.
quantity
=
parseInt
(
v
.
split
(
"="
).
pop
())
drill_toll_manage
.
push
(
res
)
})
// 给body添加刀
var
count
=
0
body
.
forEach
(
function
(
v
,
i
){
if
(
/^%$|^M00/ig
.
test
(
v
)){
var
k
=
"T"
+
getK
(
++
count
)
body
[
i
]
=
v
+
"
\n
"
+
k
}
})
// 写入文件
var
resStr
=
head
.
join
(
"
\n
"
)
+
"
\n
"
+
body
.
join
(
"
\n
"
)
fs
.
writeFile
(
file
.
path
,
resStr
)
}
})
drill_toll_manage
.
forEach
(
function
(
v
){
console
.
log
(
v
);
})
// importGerber({job:job,step:"pcs",db:"genesis",data:inputInfo.data})
}
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
function
getJobInfo
(
props
){
var
path
=
props
.
path
var
config
=
props
.
config
var
job
=
props
.
job
var
files
=
fs
.
listDir
(
path
)
files
=
files
.
filter
(
function
(
v
){
return
v
.
isFile
})
// 过滤出文件
// 先判断是不是odb
var
odbFiles
=
files
.
filter
(
function
(
file
){
// 拿到odb文件
return
config
.
odb
.
reduce
(
function
(
a
,
b
){
if
(
b
.
vaild
(
file
)){
a
=
true
}
return
a
},
false
)
})
if
(
odbFiles
.
length
){
return
{
type
:
"odb"
,
data
:
odbFiles
[
0
]
}
}
var
gerberFiles
=
files
.
filter
(
function
(
file
){
// 拿到odb文件
return
config
.
gerber
.
reduce
(
function
(
a
,
b
){
if
(
b
.
vaild
(
file
)){
file
.
gerber
=
config
.
format
[
b
.
format
];
file
.
type
=
b
.
type
;
a
=
true
}
return
a
},
false
)
})
if
(
gerberFiles
.
length
){
return
{
type
:
"gerber"
,
data
:
gerberFiles
}
}
return
"none"
}
function
importJob
(
props
){
GEN
.
importJob
(
props
);
}
function
importGerber
(
props
){
// job db step
var
job
=
props
.
job
var
step
=
props
.
step
var
files
=
props
.
data
GEN
.
createJob
({
name
:
job
,
db
:
props
.
db
})
GEN
.
createStep
({
job
:
job
,
name
:
props
.
step
})
var
gerberInfo
=
files
.
map
(
function
(
item
){
var
gerberCfg
=
JSON
.
parse
(
JSON
.
stringify
(
item
.
gerber
));
gerberCfg
.
layer
=
item
.
name
.
toLowerCase
()
gerberCfg
.
path
=
item
.
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"
)
}
function
getHead
(
arr
,
head
){
head
=
head
||
[];
if
(
arr
[
0
]
!=
"%"
){
head
.
push
(
arr
.
shift
())
return
getHead
(
arr
,
head
)
}
else
{
return
head
}
}
function
getK
(
count
){
return
count
<
10
?
"0"
+
String
(
count
)
:
String
(
count
)
}
jtg/JTG_ORG_set_origin_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'outline',
title : '外形层',
type : 'LineEdit',
property : {tool_tip : '外形层,默认是gko'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 设置零点 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 外形层 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>设置零点"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
var
default_par
=
{
outline
:
"gko"
,
auto_save
:
"No"
,
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
if
(
_
.
isEmpty
(
Job
))
var
job
=
Job
.
toLowerCase
()
var
outline
=
par
.
outline
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})
}
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// 判断参考层(outline)是否存在并不为空
if
(
!
GEN
.
isLayerExists
({
job
:
job
,
layer
:
outline
})){
throw
"outline不存在"
}
var
steplist
=
GEN
.
getStepList
({
job
:
job
})
steplist
.
forEach
(
function
(
step
){
if
(
GEN
.
isLayerEmpty
({
job
:
job
,
step
:
step
,
layer
:
outline
})){
GEN
.
openStep
({
job
:
job
,
name
:
step
})
// 将所有物件依据外形移动到零点
GEN
.
workLayer
({
name
:
outline
,
display_number
:
2
,
clear_before
:
'yes'
})
var
outline_symbol
=
GEN
.
getSymbolLimits
({
job
:
job
,
symbol
:
outline
})
GEN
.
affectedLayer
({
affected
:
"yes"
,
mode
:
"all"
})
GEN
.
selMove
({
dx
:
-
outline_symbol
.
xmin
,
dy
:
-
outline_symbol
.
ymin
})
// 创建为profile
GEN
.
affectedLayer
({
affected
:
"no"
,
mode
:
"all"
})
GEN
.
workLayer
({
name
:
outline
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selAllFeat
()
GEN
.
selCreateProfile
()
GEN
.
clearLayers
()
GEN
.
selClearFeature
()
GEN
.
closeJob
()
}
})
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
jtg/JTG_PUB_auto_save_job_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 保存料号 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>保存料号"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
try
{
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
throw
"料号没有打开"
}
// ?
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
jtg/JTG_PUB_copy_step_aim.js
0 → 100644
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'source_step',
title : '来源step',
type : 'LineEdit',
property : {tool_tip : '来源step,默认是orig'},
},
{
name : 'dest_step',
title : '目标step',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是net'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 复制net </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> step信息 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==============================>复制net"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
var
default_par
=
{
source_step
:
"orig"
,
dest_step
:
"net"
,
auto_save
:
"No"
,
}
for
(
var
key
in
default_par
){
// 设置默认属性
if
(
!
par
.
hasOwnProperty
(
key
)
||
par
[
key
]
==
""
){
par
[
key
]
=
default_par
[
key
]
}
}
if
(
_
.
isEmpty
(
Job
)){
throw
"参数Job不存在"
}
var
job
=
Job
.
toLowerCase
()
// 检查料号是否存在
if
(
!
GEN
.
isJobExists
({
job
:
job
})){
throw
"料号已经:"
+
job
+
"不存在"
}
// 检查料号是否被打开
if
(
!
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
openJob
({
job
:
job
})
}
// 检查料号是否能够check out
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
// 将source_step 拷贝到成dest_step
if
(
GEN
.
isStepExists
({
job
:
job
,
step
:
par
.
dest_step
})){
GEN
.
deleteStep
({
job
:
job
,
step
:
par
.
dest_step
})
}
GEN
.
copyStep
({
source_job
:
job
,
source_name
:
par
.
source_step
,
dest_job
:
job
,
dest_name
:
par
.
dest_step
})
// 保存
if
(
/yes/ig
.
test
(
par
.
auto_save
)){
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
})
// 结束保存料号 关闭料号
GEN
.
saveJob
({
job
:
job
});
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
GEN
.
closeJob
({
job
:
job
})
}
else
{
GEN
.
checkInout
({
job
:
job
,
mode
:
"in"
})
}
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
\ No newline at end of file
test/ATS_AIM_customer_data_analysis copy.js
View file @
1dbd449a
...
@@ -407,7 +407,9 @@ function saveJobInfo(props,par){
...
@@ -407,7 +407,9 @@ function saveJobInfo(props,par){
GEN
.
selRefFeat
({
layers
:
cover_layer
,
use
:
'filter'
,
mode
:
'cover'
})
GEN
.
selRefFeat
({
layers
:
cover_layer
,
use
:
'filter'
,
mode
:
'cover'
})
var
count
=
GEN
.
getSelectCount
()
var
count
=
GEN
.
getSelectCount
()
if
(
count
>
0
){
if
(
count
>
0
){
if
(
!
laser_info
[
start_layer
]){
laser_info
[
start_layer
]
=
{}
laser_info
[
start_layer
]
=
{}
}
laser_info
[
start_layer
].
drill_connect_layer
=
cover_layer
laser_info
[
start_layer
].
drill_connect_layer
=
cover_layer
laser_info
[
start_layer
].
drill_connect_point
=
count
laser_info
[
start_layer
].
drill_connect_point
=
count
}
}
...
@@ -554,3 +556,568 @@ function set_drill_attr(props){ // 镭射孔via,无铜孔npth,其余孔pth
...
@@ -554,3 +556,568 @@ function set_drill_attr(props){ // 镭射孔via,无铜孔npth,其余孔pth
GEN
.
selAllFeat
()
GEN
.
selAllFeat
()
GEN
.
selAddAttr
({
attribute
:
attr
})
GEN
.
selAddAttr
({
attribute
:
attr
})
}
}
/*
NAME:
DESCRIPTION: 客户数据分析
PARAMETER:
[
{
name : 'step_filter',
title : 'Step过滤',
type : 'LineEdit',
property : {tool_tip : '过滤step信息'}
},
{
name : 'erf',
title : 'erf名称',
type : 'LineEdit',
property : {tool_tip : ''}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020 3-30 Scott
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 客户数据分析</p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 客户参数 </p>
<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;
var JobId = $.job_id;
var mode = "develop" // 运行模式 develop 开发模式 方便调试
try {
var job = "1"
var matrix = UPLOAD_LAYER_MATRIX({job:job}) // 分析matrix 获得分析后的matrix信息
// 获得镭射层
var laser_drills = _.values(matrix).filter(function(v){return v.type == "laser_drill"})
// 获取钻孔信息上传
// 拿到array_step的信息
var array_step = "stp"
var arr_step_drill_tool_info = {}
GEN.openStep({job:job,name:array_step})
laser_drills.forEach(function(layer){
// 打散step
GEN.COM('sredit_reduce_nesting,mode=one_highest')
arr_step_drill_tool_info[layer] = GEN.getTool({job:job,step:array_step,layer:layer})
})
GEN.closeStep()
var stepList = ["cad"]
stepList.forEach(function(step){
GEN.openStep({job:job,name:step})
laser_drills.forEach(function(layer){
GEN.clearLayers()
GEN.workLayer({name:layer.name, display_number:1,clear_before:"yes"})
GEN.selClearFeature()
GEN.selAllFeat()
var count = GEN.getSelectCount()
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
// GEN.selAddAttr({attribute:'.drill',option:'laser'})
// GEN.selectByFilter({attribute:[{attribute:'.drill',option:'laser'}]})
// GEN.selReverse()
var tool_mamager = GEN.getTool({job:job,step:step,layer:layer.name})
Object.keys(tool_mamager).forEach(function(key){
var tool = tool_mamager[key];
var data = {
job_id: JobId,
layer_name: layer.name,
tool_num: key,
tool_flag: key,
tool_type: tool.shape,
drill_type:tool.type,
drill_size : tool.drill_size,
drill_slot_length: tool.slot_len,
finish_size : tool.finish_size,
finish_slot_length: tool.slot_len,
size_tol_lower: tool.min_tol,
size_tol_upper: tool.max_tol,
pcs_count: tool.count,
array_count: arr_step_drill_tool_info[layer.name][key].count, // todo
attr_data: {}
// {"allowance": 2, "org_layer_name": "hhhh"}
}
IKM.crud("insertRow",{
table:'pdm_job_cam_drill',
data:data,
return_field:'id',
})
})
}
GEN.selClearFeature()
GEN.clearLayers()
})
GEN.closeStep()
})
GUI.msg("Done")
return 'Done';
}
catch (error) {
GUI.msg(error);
return 'Error';
}
function UPLOAD_LAYER_MATRIX(props){
var job = props.job
props.jobcategory = props.jobcategory || "work"
var matrix = ANALYSIS_STACKUP({job:job, jobcategory:props.jobcategory});
var func = 'function(ARGV)\
{\
var jobId = ARGV["job_id"];\
var tableName = "pdm_job_" + ARGV["jobcategory"] + "_layer";\
//GUI.msgbox({text: TDataParse.variant2JsonStr(tableName)});\
var db = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());\
db.begin();\
try{\
var oLayers = db.selectMapMap({table:tableName, field:["odb_name","release_status"], where:{job_id:jobId}, uniquefield:"odb_name"});\
if (db.lastError().isValid()) throw db.lastError();\
//GUI.msgbox({text: TDataParse.variant2JsonStr(oLayers)});\
\
db.deleteRow({table:tableName, where:{job_id:jobId}});\
if (db.lastError().isValid()) throw db.lastError();\
\
var fieldLst = ["name", "odb_context", "odb_type", "odb_polarity", "odb_side", "drl_start", "drl_end",\
"row_num", "type", "drl_start_num", "drl_end_num", "drl_from_num", "drl_to_num", "drl_connect_to", \
"odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num"];\
\
for (var i=0;i<ARGV["layers"].length;i++)\
{\
layerName = ARGV["layers"][i];\
var layerInfo = ARGV["matrix"][layerName];\
var tmpData = {"job_id":jobId, "name": layerInfo["name"]};\
if (ARGV["releasestatus"] != undefined && ARGV["releasestatus"] != null && ARGV["releasestatus"].length>0\
&& ARGV["releasestatus"][layerInfo["odb_name"]] != undefined && ARGV["releasestatus"][layerInfo["odb_name"]] != null )\
{\
tmpData["release_status"] = ARGV["releasestatus"];\
}\
else\
{\
tmpData["release_status"] = oLayers.hasOwnProperty(layerInfo["odb_name"]) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;\
}\
for (n = 0; n < fieldLst.length; n++)\
{\
tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];\
}\
//GUI.msgbox({text: TDataParse.variant2JsonStr(tmpData)});\
db.insertRow({table:tableName, data:tmpData});\
if (db.lastError().isValid()) throw db.lastError();\
}\
db.commit();\
return new TDataResponse();\
}\
catch (err)\
{\
print(err.text());\
db.rollback();\
return new TDataResponse(err, "");\
}\
}';
// var ret = IKM.command( func, // ?? =========================> tmp
// { job_id :JobId,
// matrix:matrix,
// layers: Object.keys(matrix).sort(function(a,b){return matrix[a]["row"] - matrix[b]["row"]}),
// jobcategory:props.jobcategory}, 1);
// if (ret.errText) {
// return {
// jobcategory:props.jobcategory,
// errText :ret.errText,
// errCode :ret.errCode,
// };
// }
return matrix
}
function ANALYSIS_STACKUP(props){
var job = props.job
if(!props.hasOwnProperty("jobcategory")){ props.jobcategory = 'work' }
var matrix = GEN.getMatrix({job:job})
var layer_count = IKM.get_jobinfo({jobname:JobId,jobcategory:props.jobcategory,jobinfo:'layer_count'});
if(!layer_count){
layer_count = GEN.getLayerCount({job:job})
}
IKM.save_job_info({jobid:JobId,jobcategory:props.jobcategory,jobinfohash:{TL_layer_count:layer_count}});
_.values(matrix).sort(function(a,b){return a.row-b.row}).forEach(function(layer){
layer.odb_name = layer.name;
layer.name = layer.tl_name;
layer.odb_context = layer.context;
layer.odb_type = layer.layer_type;
layer.odb_polarity = layer.polarity;
layer.odb_side = layer.side;
layer.row_num = layer.tl_num;
layer.type = layer.tl_type;
layer.side = layer.enum_tl_side;
layer.input_file_name = layer.file_name;
layer.odb_row_num = layer.row;
if (layer.odb_name == 'drill'){
layer.name = 'drill';
layer.drl_start_num = 1;
layer.drl_end_num = layer_count;
layer.drl_from_num = 1;
layer.drl_to_num = layer_count;
layer.type = 'main_drill';
}
else if (/^d_(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'drill' + drl_star + '-' + drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
if( drl_star == 1 || drl_end == layer_count ){
layer.type = 'blind_drill'; // 埋孔
}
else{
layer.type = 'bury_drill'; // 盲孔
}
}
else if (/^d(\d+)\-(\d+)$/.test(layer.odb_name)){
var tmp = /^d(\d+)\-(\d+)$/.exec(layer.odb_name)
var drl_star = tmp[1];
var drl_end = tmp[2];
layer.name = 'd'+drl_star+'-'+drl_end;
layer.drl_start_num = drl_star;
layer.drl_end_num = drl_end;
layer.drl_from_num = drl_star;
layer.drl_to_num = drl_end;
layer.type = 'laser_drill'; // 镭射孔
}
else if (/\-a$/.test(layer.odb_name)){
layer.side = 'top';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else if (/\-b$/.test(layer.odb_name)){
layer.side = 'bottom';
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
else{
if(!layer.name){
layer.name = '__'+layer.odb_name+'__'
}
if(!layer.type){
layer.type = 'other'
}
}
})
return matrix;
}
function tmp(){
return {
"sst": {
"row": "1","type": "solder_paste","name": "sp_fr","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -1000,"tl_name": "sp_fr","tl_type": "solder_paste","odb_name": "sst","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top",
"row_num": -1000,"odb_row_num": "1"
},
"spt": {
"row": "2","type": "solder_paste","name": "sp_fr(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -999,"tl_name": "sp_fr(2)","tl_type": "solder_paste","odb_name": "spt","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "top",
"row_num": -999,"odb_row_num": "2"
},
"smt": {
"row": "3","type": "solder_mask","name": "sm_fr","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": -998,"tl_name": "sm_fr","tl_type": "solder_mask","odb_name": "smt","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "top",
"row_num": -998,"odb_row_num": "3"
},
"top": {
"row": "4","type": "outer","name": "top","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1,"tl_name": "top","tl_type": "outer","odb_name": "top","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "top",
"row_num": 1,"odb_row_num": "4"
},
"isl2": {
"row": "5","type": "inner","name": "l2","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 2,"tl_name": "l2","tl_type": "inner","odb_name": "isl2","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 2,"odb_row_num": "5"
},
"isl3": {
"row": "6","type": "inner","name": "l3","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 3,"tl_name": "l3","tl_type": "inner","odb_name": "isl3","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 3,"odb_row_num": "6"
},
"isl4": {
"row": "7","type": "inner","name": "l4","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 4,"tl_name": "l4","tl_type": "inner","odb_name": "isl4","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 4,"odb_row_num": "7"
},
"isl5": {
"row": "8","type": "inner","name": "l5","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 5,"tl_name": "l5","tl_type": "inner","odb_name": "isl5","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 5,"odb_row_num": "8"
},
"isl6": {
"row": "9","type": "inner","name": "l6","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 6,"tl_name": "l6","tl_type": "inner","odb_name": "isl6","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 6,"odb_row_num": "9"
},
"isl7": {
"row": "10","type": "inner","name": "l7","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 7,"tl_name": "l7","tl_type": "inner","odb_name": "isl7","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 7,"odb_row_num": "10"
},
"isl8": {
"row": "11","type": "inner","name": "l8","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 8,"tl_name": "l8","tl_type": "inner","odb_name": "isl8","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 8,"odb_row_num": "11"
},
"isl9": {
"row": "12","type": "inner","name": "l9","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 9,"tl_name": "l9","tl_type": "inner","odb_name": "isl9","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "inner",
"row_num": 9,"odb_row_num": "12"
},
"bottom": {
"row": "13","type": "outer","name": "bottom","context": "board","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 10,"tl_name": "bottom","tl_type": "outer","odb_name": "bottom","odb_context": "board","odb_type": "signal","odb_polarity": "positive","odb_side": "bottom",
"row_num": 10,"odb_row_num": "13"
},
"smb": {
"row": "14","type": "solder_mask","name": "sm_ba","context": "board","layer_type": "solder_mask","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1013,"tl_name": "sm_ba","tl_type": "solder_mask","odb_name": "smb","odb_context": "board","odb_type": "solder_mask","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1013,"odb_row_num": "14"
},
"spb": {
"row": "15","type": "solder_paste","name": "sp_ba","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1014,"tl_name": "sp_ba","tl_type": "solder_paste","odb_name": "spb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1014,"odb_row_num": "15"
},
"ssb": {
"row": "16","type": "solder_paste","name": "sp_ba(2)","context": "board","layer_type": "solder_paste","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 1015,"tl_name": "sp_ba(2)","tl_type": "solder_paste","odb_name": "ssb","odb_context": "board","odb_type": "solder_paste","odb_polarity": "positive","odb_side": "bottom",
"row_num": 1015,"odb_row_num": "16"
},
"d1-2": {
"row": "17","type": "laser_drill","name": "d1-2","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top",
"drl_end": "isl2","gdrl_start": "top","gdrl_end": "isl2","drl_start_num": "1","drl_end_num": "2","tl_name": "drill1-2","tl_type": "drill",
"tl_num": 10016,"odb_name": "d1-2","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10016,"odb_row_num": "17","drl_from_num": "1","drl_to_num": "2"
},
"d2-3": {
"row": "18","type": "laser_drill","name": "d2-3","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl2","drl_end": "isl3","gdrl_start": "isl2","gdrl_end": "isl3","drl_start_num": "2","drl_end_num": "3","tl_name": "drill2-3","tl_type": "drill",
"tl_num": 10017,"odb_name": "d2-3","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10017,"odb_row_num": "18","drl_from_num": "2","drl_to_num": "3"
},
"d3-4": {
"row": "19","type": "laser_drill","name": "d3-4","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl3","drl_end": "isl4","gdrl_start": "isl3","gdrl_end": "isl4","drl_start_num": "3","drl_end_num": "4","tl_name": "drill3-4","tl_type": "drill",
"tl_num": 10018,"odb_name": "d3-4","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10018,"odb_row_num": "19","drl_from_num": "3","drl_to_num": "4"
},
"d4-5": {
"row": "20","type": "laser_drill","name": "d4-5","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl4","drl_end": "isl5","gdrl_start": "isl4","gdrl_end": "isl5","drl_start_num": "4","drl_end_num": "5","tl_name": "drill4-5","tl_type": "drill",
"tl_num": 10019,"odb_name": "d4-5","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10019,"odb_row_num": "20","drl_from_num": "4","drl_to_num": "5"
},
"d5-6": {
"row": "21","type": "laser_drill","name": "d5-6","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl5","drl_end": "isl6","gdrl_start": "isl5","gdrl_end": "isl6","drl_start_num": "5","drl_end_num": "6","tl_name": "drill5-6","tl_type": "drill",
"tl_num": 10020,"odb_name": "d5-6","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10020,"odb_row_num": "21","drl_from_num": "5","drl_to_num": "6"
},
"d6-7": {
"row": "22","type": "laser_drill","name": "d6-7","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl6","drl_end": "isl7","gdrl_start": "isl6","gdrl_end": "isl7","drl_start_num": "6","drl_end_num": "7","tl_name": "drill6-7","tl_type": "drill",
"tl_num": 10021,"odb_name": "d6-7","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10021,"odb_row_num": "22","drl_from_num": "6","drl_to_num": "7"
},
"d7-8": {
"row": "23","type": "laser_drill","name": "d7-8","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl7","drl_end": "isl8","gdrl_start": "isl7","gdrl_end": "isl8","drl_start_num": "7","drl_end_num": "8","tl_name": "drill7-8","tl_type": "drill",
"tl_num": 10022,"odb_name": "d7-8","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10022,"odb_row_num": "23","drl_from_num": "7","drl_to_num": "8"
},
"d8-9": {
"row": "24","type": "laser_drill","name": "d8-9","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl8","drl_end": "isl9","gdrl_start": "isl8","gdrl_end": "isl9","drl_start_num": "8","drl_end_num": "9","tl_name": "drill8-9","tl_type": "drill",
"tl_num": 10023,"odb_name": "d8-9","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10023,"odb_row_num": "24","drl_from_num": "8","drl_to_num": "9"
},
"d9-10": {
"row": "25","type": "laser_drill","name": "d9-10","context": "board","layer_type": "drill","polarity": "positive","drl_start": "isl9","drl_end": "bottom","gdrl_start": "isl9","gdrl_end": "bottom","drl_start_num": "9","drl_end_num": "10","tl_name": "drill9-10","tl_type": "drill",
"tl_num": 10024,"odb_name": "d9-10","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10024,"odb_row_num": "25","drl_from_num": "9","drl_to_num": "10"
},
"drill": {
"row": "26","type": "main_drill","name": "drill","context": "board","layer_type": "drill","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","drl_start_num": 1,"drl_end_num": 10,"tl_name": "drill","tl_type": "drill",
"tl_num": 10025,"odb_name": "drill","odb_context": "board","odb_type": "drill","odb_polarity": "positive","odb_side": "none",
"row_num": 10025,"odb_row_num": "26","drl_from_num": 1,"drl_to_num": 10
},
"rout": {
"row": "27","type": "other","name": "__rout__","context": "board","layer_type": "rout","polarity": "positive","drl_start": "top","drl_end": "bottom","gdrl_start": "top","gdrl_end": "bottom","odb_name": "rout","odb_context": "board","odb_type": "rout","odb_polarity": "positive","odb_side": "none","odb_row_num": "27"
},
"nclegend-1-2": {
"row": "28","type": "other","name": "__nclegend-1-2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110027,"odb_name": "nclegend-1-2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110027,"odb_row_num": "28"
},
"nclegend-2-3": {
"row": "29","type": "other","name": "__nclegend-2-3__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110028,"odb_name": "nclegend-2-3","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110028,"odb_row_num": "29"
},
"nclegend-3-4": {
"row": "30","type": "other","name": "__nclegend-3-4__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110029,"odb_name": "nclegend-3-4","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110029,"odb_row_num": "30"
},
"nclegend-4-5": {
"row": "31","type": "other","name": "__nclegend-4-5__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110030,"odb_name": "nclegend-4-5","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110030,"odb_row_num": "31"
},
"nclegend-5-6": {
"row": "32","type": "other","name": "__nclegend-5-6__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110031,"odb_name": "nclegend-5-6","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110031,"odb_row_num": "32"
},
"nclegend-6-7": {
"row": "33","type": "other","name": "__nclegend-6-7__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110032,"odb_name": "nclegend-6-7","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110032,"odb_row_num": "33"
},
"nclegend-7-8": {
"row": "34","type": "other","name": "__nclegend-7-8__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110033,"odb_name": "nclegend-7-8","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110033,"odb_row_num": "34"
},
"nclegend-8-9": {
"row": "35","type": "other","name": "__nclegend-8-9__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110034,"odb_name": "nclegend-8-9","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110034,"odb_row_num": "35"
},
"nclegend-9-10": {
"row": "36","type": "other","name": "__nclegend-9-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110035,"odb_name": "nclegend-9-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110035,"odb_row_num": "36"
},
"nclegend-1-10": {
"row": "37","type": "other","name": "__nclegend-1-10__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110036,"odb_name": "nclegend-1-10","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110036,"odb_row_num": "37"
},
"outline": {
"row": "38","type": "other","name": "__outline__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110037,"odb_name": "outline","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110037,"odb_row_num": "38"
},
"top_assem": {
"row": "39","type": "other","name": "__top_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110038,"odb_name": "top_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110038,"odb_row_num": "39"
},
"bot_assem": {
"row": "40","type": "other","name": "__bot_assem__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110039,"odb_name": "bot_assem","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110039,"odb_row_num": "40"
},
"top_testpoint": {
"row": "41","type": "other","name": "__top_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110040,"odb_name": "top_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110040,"odb_row_num": "41"
},
"bot_testpoint": {
"row": "42","type": "other","name": "__bot_testpoint__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110041,"odb_name": "bot_testpoint","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110041,"odb_row_num": "42"
},
"top_osp": {
"row": "43","type": "other","name": "__top_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110042,"odb_name": "top_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110042,"odb_row_num": "43"
},
"bot_osp": {
"row": "44","type": "other","name": "__bot_osp__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110043,"odb_name": "bot_osp","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110043,"odb_row_num": "44"
},
"top_enig": {
"row": "45","type": "other","name": "__top_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110044,"odb_name": "top_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110044,"odb_row_num": "45"
},
"bot_enig": {
"row": "46","type": "other","name": "__bot_enig__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110045,"odb_name": "bot_enig","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110045,"odb_row_num": "46"
},
"fab_page2": {
"row": "47","type": "other","name": "__fab_page2__","context": "misc","layer_type": "document","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110046,"odb_name": "fab_page2","odb_context": "misc","odb_type": "document","odb_polarity": "positive","odb_side": "none",
"row_num": 110046,"odb_row_num": "47"
},
"tmp_top_shorts": {
"row": "48","type": "other","name": "__tmp_top_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110047,"odb_name": "tmp_top_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110047,"odb_row_num": "48"
},
"tmp_bot_shorts": {
"row": "49","type": "other","name": "__tmp_bot_shorts__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110048,"odb_name": "tmp_bot_shorts","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110048,"odb_row_num": "49"
},
"bot_assy_mate": {
"row": "50","type": "other","name": "__bot_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110049,"odb_name": "bot_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110049,"odb_row_num": "50"
},
"outline+1": {
"row": "51","type": "other","name": "__outline+1__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110050,"odb_name": "outline+1","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110050,"odb_row_num": "51"
},
"top_assy_mate": {
"row": "52","type": "other","name": "__top_assy_mate__","context": "misc","layer_type": "signal","polarity": "positive","drl_start": "","drl_end": "","gdrl_start": "","gdrl_end": "",
"tl_num": 110051,"odb_name": "top_assy_mate","odb_context": "misc","odb_type": "signal","odb_polarity": "positive","odb_side": "none",
"row_num": 110051,"odb_row_num": "52"
}
}
}
*/
\ No newline at end of file
test/ATS_AIM_customer_data_analysis.js
View file @
1dbd449a
...
@@ -58,56 +58,141 @@ var JobId = $.job_id;
...
@@ -58,56 +58,141 @@ var JobId = $.job_id;
var
mode
=
"develop"
// 运行模式 develop 开发模式 方便调试
var
mode
=
"develop"
// 运行模式 develop 开发模式 方便调试
try
{
try
{
// IKM.crud("insertRow",{
// table:'pdm_job_org_drill',
// data:{job_id:"1",step_name:"cad",step_type:"pcs", std_layer_name:"d_1-2",odb_layer_name:"d1-2",
// row_num:"1", drill_size:"r2",finish_size:"r2.1",drill_type:"laser_drill",drill_shape:"s",
// slot_length:"12", count:"231",drill_size_lower_tol:"23",drill_size_upper_tol:"asd"
// },
// return_field:'uid',
// })
var
job
=
"1"
var
job
=
"1"
var
pcs_step
=
"cad"
,
array_step
=
"stp"
;
var
matrix
=
UPLOAD_LAYER_MATRIX
({
job
:
job
})
// 分析matrix 获得分析后的matrix信息
var
matrix
=
UPLOAD_LAYER_MATRIX
({
job
:
job
})
// 分析matrix 获得分析后的matrix信息
// 获得镭射层
var
analysis_obj
=
analysis
({
job
:
job
,
jobId
:
JobId
,
pcs_step
:
pcs_step
,
array_step
:
array_step
,
matrix
:
matrix
})
var
config
=
{
jobInfo
:
{
layer_count
:
[
"signal"
,
"power_ground"
],
// Board属性的signal或者power_ground层
vc_card_size_w
:
{
api
:
"vc_card_size"
,
props
:
"xsize"
},
// card短边尺寸 // ? 保留小数
vc_card_size_l
:
{
api
:
"vc_card_size"
,
props
:
"ysize"
},
// card长边尺寸 // ? 保留小数
vc_array_size_w
:
{
api
:
"vc_array_size"
,
props
:
"xsize"
},
// ! array短边尺寸 需要arr_step // ? 保留小数
vc_array_size_l
:
{
api
:
"vc_array_size"
,
props
:
"ysize"
},
// ! array长边尺寸 需要arr_step // ? 保留小数
vc_pcs_count_on_panel
:
true
,
// todo array中pcs的数量 ! 需要arr_step
stack_vias_number
:
true
,
// via孔连续叠加的层数
stack_vias_more
:
{
only_value
:
true
},
// yes|no : 14层板以上时,Stack Vias >=12时,存yes // ! 需要分析完via连续叠加层数
depth_drilling
:
{
api
:
"layer_exist"
,
props
:
"depth_drill"
},
// yes|no :存在depth_drill 层时 ,存yes
depth_routing
:
{
api
:
"layer_exist"
,
props
:
"depth_routing"
},
// tmp yes|no :存在depth_routing 层时,,存yes
laser_via_on_buried_hole
:
true
,
// todo via孔在埋孔上时,存yes
milling_bit_size
:
true
,
// todo 检查array中pcs的最小间距值
milling_length
:
true
,
// todo 检查array中铣切长度
vc_src_01005_pad_result
:
{
api
:
"board_has_attr"
,
props
:
".smd"
},
// * yes|no:board 层中检查存在01005属性物件时,存yes 这里先拿.smd代替了
ATS_technology_25dc
:
{
api
:
"layer_exist"
,
props
:
"cavity"
},
// yes|no:存在cavity层别时存yes
ATS_technology_25dr
:
{
api
:
"layer_exist"
,
props
:
"cavity"
},
// yes|no:存在cavity层别时存yes
vc_src_EDGE_PLATING
:
true
,
// yes|no:检查线路外形是否存在物件,存在则存yes // !料号需要有rout层
edge_plating_length
:
true
,
// todo 检查线路外形处物件的长度
glod_finger
:
true
,
// todo yes|no:暂无逻辑
glod_finger_area
:
true
,
// todo 暂无逻辑
solder_mask_side
:
true
,
// top|bot|both:检查防焊层所在面次
silk_screen_side
:
true
,
// top|bot|both:检查文字层所在面次
min_drl_size
:
true
,
// todo 0.5mm 最小圆孔
max_pth_drl_size
:
true
,
// todo 3.5mm 最大pth圆孔
max_npth_drl_size
:
true
,
// todo 6.0mm 最大npth圆孔
min_slot_drl_size
:
true
,
// todo 0.8mm 最小槽孔
max_slot_drl_size
:
true
,
// todo 1.2mm 最大槽孔
max_slot_drl_length
:
true
,
// todo 2.0mm 最大槽孔
max_spec_slot_drl_size
:
true
,
// todo 2.1mm 最大异形槽孔
max_spec_slot_drl_length
:
true
,
// todo 3.0mm 最大异形槽孔
}
}
// 分析料号info
var
jobInfo
=
{}
Object
.
keys
(
config
.
jobInfo
).
forEach
(
function
(
key
){
var
props
=
config
.
jobInfo
[
key
];
if
(
props
){
try
{
if
(
props
.
hasOwnProperty
(
"api"
)
&&
props
.
hasOwnProperty
(
"props"
)){
jobInfo
[
key
]
=
analysis_obj
[
"analysis_"
+
props
.
api
](
props
.
props
)
}
else
if
(
props
.
only_value
){
jobInfo
[
key
]
=
analysis_obj
[
key
]
}
else
{
jobInfo
[
key
]
=
analysis_obj
[
"analysis_"
+
key
](
props
)
}
}
catch
(
e
)
{
console
.
log
(
e
);
jobInfo
[
key
]
=
"_error"
}
}
})
// 过滤掉料号信息的 _todo 和 _error
for
(
var
key
in
jobInfo
)
{
if
(
jobInfo
[
key
]
===
"_todo"
||
jobInfo
[
key
]
===
"_error"
){
delete
jobInfo
[
key
]
}
}
// 上传jobInfo IKM版本
IKM
.
save_job_info
({
jobid
:
JobId
,
jobinfohash
:
jobInfo
})
// todo 上传jobInfo topjs3版本
// save_job_info({
// jobid: JobId,
// jobinfohash: jobInfo
// })
var
laser_drills
=
_
.
values
(
matrix
).
filter
(
function
(
v
){
return
v
.
type
==
"laser_drill"
})
// todo 设置钻孔层孔属性,镭射孔via,无铜孔npth,其余孔pth
laser_drills
.
forEach
(
function
(
layer
){
// todo 上传钻孔信息
GEN
.
workLayer
({
name
:
layer
.
name
,
display_number
:
1
,
clear_before
:
"yes"
})
// 获取pcs_step 和 array_step的钻孔信息
GEN
.
selClearFeature
()
var
drill_info
=
{};
GEN
.
selAllFeat
()
var
drillLayers
=
analysis_obj
.
matrixInfo
.
mDrills
;
var
count
=
GEN
.
getSelectCount
()
[
pcs_step
,
array_step
].
forEach
(
function
(
step
){
if
(
GEN
.
getSelectCount
()
>
0
){
drill_info
[
step
]
=
drill_info
[
step
]
||
{};
// GEN.selAddAttr({attribute:"via"})
drillLayers
.
forEach
(
function
(
layer
){
var
layer_tool_manager
=
GEN
.
getTool
({
job
:
job
,
step
:
step
,
layer
:
layer
.
name
})
drill_info
[
step
][
layer
.
name
]
=
layer_tool_manager
})
})
var
pcs_tool_manager
=
drill_info
[
pcs_step
];
var
array_tool_manager
=
drill_info
[
array_step
];
Object
.
keys
(
pcs_tool_manager
).
forEach
(
function
(
layer
){
Object
.
keys
(
pcs_tool_manager
[
layer
]).
forEach
(
function
(
key
){
var
tool
=
pcs_tool_manager
[
layer
][
key
];
var
array_count
;
if
(
array_tool_manager
&&
array_tool_manager
[
layer
]
&&
array_tool_manager
[
layer
][
key
]){
array_count
=
array_tool_manager
[
layer
][
key
].
count
}
var
data
=
{
var
data
=
{
job_id
:
JobId
,
job_id
:
JobId
,
step_name
:
"cad"
,
layer_name
:
layer
,
odb_layer_name
:
layer
.
odb_name
,
tool_num
:
key
,
row_num
:
layer
.
row_num
,
tool_flag
:
key
,
drill_type
:
layer
.
type
,
tool_type
:
tool
.
shape
,
count
:
count
drill_type
:
tool
.
type
,
drill_size
:
tool
.
drill_size
,
drill_slot_length
:
tool
.
slot_len
,
finish_size
:
tool
.
finish_size
,
finish_slot_length
:
tool
.
slot_len
,
size_tol_lower
:
tool
.
min_tol
,
size_tol_upper
:
tool
.
max_tol
,
pcs_count
:
tool
.
count
,
array_count
:
array_count
,
// todo
attr_data
:
{}
// {"allowance": 2, "org_layer_name": "hhhh"}
}
}
if
(
!
array_count
){
delete
data
.
array_count
}
var
id
=
IKM
.
crud
(
"selectValue"
,{
table
:
'pdm_job_cam_drill'
,
field
:
"id"
,
where
:{
job_id
:
JobId
,
layer_name
:
layer
,
tool_num
:
key
}
})
if
(
/done/ig
.
test
(
id
)){
IKM
.
crud
(
"insertRow"
,{
table
:
'pdm_job_cam_drill'
,
data
:
data
,
return_field
:
'id'
,
})
}
else
{
IKM
.
crud
(
"updateRow"
,{
table
:
'pdm_job_cam_drill'
,
where
:
{
id
:
id
},
data
:
data
,
update_policy
:{
tags
:
'array_append'
,
attr_data
:
'json_merge'
}
})
}
}
GEN
.
selClearFeature
()
GEN
.
clearLayers
()
})
})
var
laser_drills_info
=
laser_drills
})
// 获取钻孔信息
GUI
.
msg
(
"Done"
)
GUI
.
msg
(
"Done"
)
return
'Done'
;
return
'Done'
;
...
@@ -271,9 +356,306 @@ function ANALYSIS_STACKUP(props){
...
@@ -271,9 +356,306 @@ function ANALYSIS_STACKUP(props){
})
})
return
matrix
;
return
matrix
;
}
}
function
getMatrixInfo
(
props
){
// 获取matrix各种信息
var
job
=
props
.
job
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
res
=
{
matrix
:
matrix
,
// matrix
matrixVal
:
[],
// matrix 的 value数组
mSignal
:
{},
// board的signal层 {}
mSignals
:
[],
// board的signal层 []
mDrill
:
{},
// board的drill层
mDrills
:
[],
// board的drill层
mSolderMask
:
{},
// 防焊层
mSolderMasks
:
[],
// 防焊层
mOuters
:
[],
// 外层和对于的防旱
mBoardLayer
:
[]
// board层
}
for
(
var
key
in
matrix
)
{
var
value
=
matrix
[
key
]
res
.
matrixVal
.
push
(
value
)
if
(
value
.
context
==
"board"
){
res
.
mBoardLayer
.
push
(
key
)
switch
(
value
.
layer_type
)
{
case
"signal"
:
res
.
mSignal
[
key
]
=
value
res
.
mSignals
.
push
(
value
)
break
;
case
"drill"
:
res
.
mDrill
[
key
]
=
value
res
.
mDrills
.
push
(
value
)
break
;
case
"solder_mask"
:
res
.
mSolderMask
[
key
]
=
value
res
.
mSolderMasks
.
push
(
value
)
break
;
}
}
}
res
.
matrixVal
=
res
.
matrixVal
.
sort
(
function
(
a
,
b
){
return
Number
(
a
.
row
)
-
Number
(
b
.
row
)})
res
.
mSignals
=
res
.
mSignals
.
sort
(
function
(
a
,
b
){
return
Number
(
a
.
row
)
-
Number
(
b
.
row
)})
res
.
mDrills
=
res
.
mDrills
.
sort
(
function
(
a
,
b
){
return
Number
(
a
.
row
)
-
Number
(
b
.
row
)})
// 找出外层 以及外层对应的防焊层 [{signalL:"top", solderL:"smt"}]
res
.
mOuters
=
res
.
mSignals
.
reduce
(
function
(
a
,
b
){
if
(
b
.
tl_type
==
"outer"
){
var
solderLayers
=
res
.
mSolderMasks
.
filter
(
function
(
v
){
return
v
.
side
==
b
.
side
})
a
.
push
({
signalL
:
b
.
name
,
solderL
:
solderLayers
.
length
>
0
?
solderLayers
[
0
][
"name"
]
:
null
})
}
return
a
},[])
return
res
}
function
selCopyLayer
(
props
){
// 拷贝选择的到辅助层
var
layer
=
props
.
layer
var
job
=
props
.
job
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
layer
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
layer
})
}
GEN
.
selCopyOther
({
dest
:
'layer_name'
,
target_layer
:
layer
})
}
function
save_job_info
(
props
){
// todo 保存料号信息
}
function
analysis
(
props
){
var
job
=
props
.
job
||
Job
;
var
jobId
=
props
.
jobId
||
JobId
;
var
pcs_step
=
props
.
pcs_step
||
false
;
var
array_step
=
props
.
array_step
||
false
;
var
matrix
=
props
.
matrix
;
function
T_m_p
(
props
){
this
.
job
=
props
.
job
;
this
.
jobInfo
=
{};
this
.
jobId
=
props
.
jobId
;
if
(
props
.
pcs_step
){
this
.
pcs_step
=
props
.
pcs_step
;
}
if
(
props
.
matrix
){
this
.
matrix
=
props
.
matrix
;
}
if
(
props
.
array_step
){
this
.
array_step
=
props
.
array_step
;
}
this
.
matrixInfo
=
getMatrixInfo
({
job
:
this
.
job
})
this
.
init
();
}
T_m_p
.
prototype
.
init
=
function
(){
var
init_checking
=
[
"job"
,
"jobId"
,
"pcs_step"
,
"matrix"
];
var
t
=
this
;
init_checking
.
forEach
(
function
(
v
){
if
(
!
t
[
v
]){
t
.
e
(
v
+
" is undefined"
)}
})
}
T_m_p
.
prototype
.
e
=
function
(
e
){
// 处理error
console
.
log
(
e
)
throw
e
}
T_m_p
.
prototype
.
analysis_layer_count
=
function
(
props
){
// 分析board属性的层数量 []string
var
matrix
=
this
.
matrixInfo
.
matrixVal
;
var
res
=
matrix
.
filter
(
function
(
v
){
return
v
.
context
==
"board"
&&
props
.
indexOf
(
v
.
layer_type
)
>=
0
})
return
res
.
length
}
T_m_p
.
prototype
.
analysis_vc_card_size
=
function
(
props
){
// card短边尺寸 string
return
GEN
.
getProfileLimits
({
job
:
this
.
job
,
step
:
this
.
pcs_step
})[
props
].
toFixed
(
3
)
}
T_m_p
.
prototype
.
analysis_vc_array_size
=
function
(
props
){
// array长边尺寸 string
if
(
!
this
.
array_step
){
return
"error"
}
return
GEN
.
getProfileLimits
({
job
:
this
.
job
,
step
:
this
.
array_step
})[
props
].
toFixed
(
3
)
}
T_m_p
.
prototype
.
analysis_vc_pcs_count_on_panel
=
function
(
props
){
//
return
"_todo"
}
T_m_p
.
prototype
.
analysis_stack_vias_number
=
function
(
props
){
// via孔连续叠加的层数
var
t
=
this
;
var
res
;
// 找出 镭射孔
var
laser_layers
=
[]
for
(
var
key
in
t
.
matrix
)
{
var
val
=
t
.
matrix
[
key
]
if
(
val
.
type
==
"laser_drill"
){
laser_layers
.
push
(
val
)
}
}
if
(
laser_layers
.
length
==
0
){
return
"error"
}
GEN
.
openStep
({
job
:
t
.
job
,
name
:
t
.
pcs_step
})
laser_layers
=
laser_layers
.
sort
(
function
(
a
,
b
){
return
Number
(
a
.
row
)
-
Number
(
b
.
row
)})
var
laser_info
=
{}
for
(
var
i
=
0
;
i
<
laser_layers
.
length
-
1
;
i
++
){
var
start_layer
=
laser_layers
[
i
].
name
var
cover_layer
=
laser_layers
[
i
+
1
].
name
GEN
.
workLayer
({
name
:
start_layer
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selClearFeature
()
GEN
.
selRefFeat
({
layers
:
cover_layer
,
use
:
'filter'
,
mode
:
'cover'
})
var
count
=
GEN
.
getSelectCount
()
if
(
count
>
0
){
if
(
!
laser_info
[
start_layer
]){
laser_info
[
start_layer
]
=
{}
}
laser_info
[
start_layer
].
drill_connect_layer
=
cover_layer
laser_info
[
start_layer
].
drill_connect_point
=
count
}
}
// via孔连续叠加的层数
var
via_vias_info
=
[]
function
analysis_via_number
(
layers
){
if
(
layers
.
length
<
2
){
return
}
var
startlayer
=
layers
[
0
].
name
+
"_cover"
GEN
.
selClearFeature
()
GEN
.
workLayer
({
name
:
layers
[
0
].
name
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selAllFeat
()
selCopyLayer
({
job
:
t
.
job
,
layer
:
startlayer
})
var
end_index
=
start_cover_next
(
startlayer
,
layers
,
0
)
via_vias_info
.
push
(
end_index
+
1
)
analysis_via_number
(
layers
.
slice
(
end_index
))
}
function
start_cover_next
(
start
,
layers
,
end_index
){
if
(
layers
.
length
<
2
){
GEN
.
deleteLayer
({
job
:
t
.
job
,
layer
:
start
})
return
end_index
}
layers
=
layers
.
slice
(
1
)
GEN
.
workLayer
({
name
:
start
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selClearFeature
()
GEN
.
selRefFeat
({
layers
:
layers
[
0
].
name
,
use
:
'filter'
,
mode
:
'cover'
})
var
count
=
GEN
.
getSelectCount
()
if
(
count
<
1
)
{
GEN
.
deleteLayer
({
job
:
t
.
job
,
layer
:
start
})
return
++
end_index
}
var
nextstartlayer
=
layers
[
0
].
name
+
"_cover"
selCopyLayer
({
job
:
t
.
job
,
layer
:
nextstartlayer
})
GEN
.
deleteLayer
({
job
:
t
.
job
,
layer
:
start
})
return
start_cover_next
(
nextstartlayer
,
layers
,
++
end_index
)
}
analysis_via_number
(
laser_layers
.
slice
())
if
(
via_vias_info
.
length
==
1
){
res
=
via_vias_info
[
0
]
}
else
{
res
=
via_vias_info
.
reduce
(
function
(
a
,
b
){
return
a
-
b
>
0
?
a
:
b
})
}
t
.
jobInfo
.
stack_vias_more
=
"no"
if
(
GEN
.
getLayerCount
({
job
:
t
.
job
})
>
14
&&
res
>=
12
){
t
.
jobInfo
.
stack_vias_more
=
"yes"
}
t
.
jobInfo
.
laser_info
=
laser_info
;
return
res
}
T_m_p
.
prototype
.
analysis_layer_exist
=
function
(
props
){
// 存在某某层? string
return
this
.
matrixInfo
.
matrix
.
hasOwnProperty
(
props
)
?
"yes"
:
"no"
}
T_m_p
.
prototype
.
analysis_laser_via_on_buried_hole
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_milling_bit_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_milling_length
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_board_has_attr
=
function
(
props
){
// board层中检查存在01005属性物件时
GEN
.
openStep
({
job
:
this
.
job
,
name
:
this
.
pcs_step
})
GEN
.
clearLayers
()
GEN
.
affectedLayer
({
affected
:
'yes'
,
layer
:
this
.
matrixInfo
.
mBoardLayer
,
clear_before
:
'yes'
});
GEN
.
selClearFeature
()
GEN
.
selectByFilter
({
attribute
:
props
})
var
res
=
GEN
.
getSelectCount
()
>
0
?
"yes"
:
"no"
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
});
GEN
.
selClearFeature
()
GEN
.
closeStep
()
return
res
}
T_m_p
.
prototype
.
analysis_vc_src_EDGE_PLATING
=
function
(
props
){
// ? 检查线路外形是否存在物件,存在则存yes
var
res
=
"no"
var
rout
=
this
.
matrixInfo
.
matrixVal
.
filter
(
function
(
v
){
return
v
.
layer_type
==
"rout"
})
// 找rout层
if
(
rout
.
length
==
0
){
return
"error:cant find rout layer"
}
GEN
.
openStep
({
job
:
this
.
job
,
name
:
this
.
pcs_step
})
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
})
try
{
this
.
matrixInfo
.
mSignals
.
forEach
(
function
(
v
){
// 用线路层逐层与rout层touch 找得到说明存在
GEN
.
workLayer
({
name
:
v
.
name
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selClearFeature
()
GEN
.
selRefFeat
({
layers
:
rout
[
0
].
name
,
mode
:
"touch"
,
use
:
"filter"
})
if
(
GEN
.
getSelectCount
()
>
0
){
throw
"yes"
}
GEN
.
clearLayers
()
})
}
catch
(
msg
)
{
res
=
msg
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
})
GEN
.
selClearFeature
()
}
GEN
.
closeStep
()
return
res
}
T_m_p
.
prototype
.
analysis_edge_plating_length
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_glod_finger
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_glod_finger_area
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_solder_mask_side
=
function
(){
// 检查防焊层所在面次
var
solder_paste_layers
=
this
.
matrixInfo
.
matrixVal
.
filter
(
function
(
v
){
return
v
.
layer_type
==
"solder_paste"
})
var
solder_paste_info
=
solder_paste_layers
.
map
(
function
(
v
){
return
v
.
side
}).
reduce
(
function
(
a
,
b
){
if
(
a
.
indexOf
(
b
)
<
0
){
a
.
push
(
b
)
}
return
a
},[])
var
res
=
"no"
if
(
solder_paste_info
.
length
==
0
){
res
=
"no"
}
else
if
(
solder_paste_info
.
length
==
1
)
{
res
=
/top/ig
.
test
(
solder_paste_info
[
0
])
?
"top"
:
"bot"
}
else
{
res
=
"both"
}
return
res
}
T_m_p
.
prototype
.
analysis_silk_screen_side
=
function
(){
// 检查文字层所在面次
var
solder_mask_layers
=
this
.
matrixInfo
.
matrixVal
.
filter
(
function
(
v
){
return
v
.
layer_type
==
"solder_mask"
})
var
solder_mask_info
=
solder_mask_layers
.
map
(
function
(
v
){
return
v
.
side
}).
reduce
(
function
(
a
,
b
){
if
(
a
.
indexOf
(
b
)
<
0
){
a
.
push
(
b
)
}
return
a
},[])
var
res
=
"no"
if
(
solder_mask_info
.
length
==
0
){
res
=
"no"
}
else
if
(
solder_mask_info
.
length
==
1
)
{
res
=
/top/ig
.
test
(
solder_mask_info
[
0
])
?
"top"
:
"bot"
}
else
{
res
=
"both"
}
return
res
}
T_m_p
.
prototype
.
analysis_min_drl_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_max_pth_drl_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_max_npth_drl_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_min_slot_drl_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_max_slot_drl_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_max_slot_drl_length
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_max_spec_slot_drl_size
=
function
(){
// todo
return
"_todo"
}
T_m_p
.
prototype
.
analysis_max_spec_slot_drl_length
=
function
(){
// todo
return
"_todo"
}
return
new
T_m_p
({
job
:
job
,
jobId
:
jobId
,
pcs_step
:
pcs_step
,
array_step
:
array_step
,
matrix
:
matrix
})
}
function
tmp
(){
function
tmp
(){
return
{
return
{
"sst"
:
{
"sst"
:
{
"row"
:
"1"
,
"type"
:
"solder_paste"
,
"name"
:
"sp_fr"
,
"context"
:
"board"
,
"layer_type"
:
"solder_paste"
,
"polarity"
:
"positive"
,
"drl_start"
:
""
,
"drl_end"
:
""
,
"gdrl_start"
:
""
,
"gdrl_end"
:
""
,
"row"
:
"1"
,
"type"
:
"solder_paste"
,
"name"
:
"sp_fr"
,
"context"
:
"board"
,
"layer_type"
:
"solder_paste"
,
"polarity"
:
"positive"
,
"drl_start"
:
""
,
"drl_end"
:
""
,
"gdrl_start"
:
""
,
"gdrl_end"
:
""
,
"tl_num"
:
-
1000
,
"tl_name"
:
"sp_fr"
,
"tl_type"
:
"solder_paste"
,
"odb_name"
:
"sst"
,
"odb_context"
:
"board"
,
"odb_type"
:
"solder_paste"
,
"odb_polarity"
:
"positive"
,
"odb_side"
:
"top"
,
"tl_num"
:
-
1000
,
"tl_name"
:
"sp_fr"
,
"tl_type"
:
"solder_paste"
,
"odb_name"
:
"sst"
,
"odb_context"
:
"board"
,
"odb_type"
:
"solder_paste"
,
"odb_polarity"
:
"positive"
,
"odb_side"
:
"top"
,
...
@@ -533,9 +915,266 @@ return {
...
@@ -533,9 +915,266 @@ return {
"tl_num"
:
110051
,
"odb_name"
:
"top_assy_mate"
,
"odb_context"
:
"misc"
,
"odb_type"
:
"signal"
,
"odb_polarity"
:
"positive"
,
"odb_side"
:
"none"
,
"tl_num"
:
110051
,
"odb_name"
:
"top_assy_mate"
,
"odb_context"
:
"misc"
,
"odb_type"
:
"signal"
,
"odb_polarity"
:
"positive"
,
"odb_side"
:
"none"
,
"row_num"
:
110051
,
"odb_row_num"
:
"52"
"row_num"
:
110051
,
"odb_row_num"
:
"52"
}
}
}
}
}
}
function
tmp_2
(){
return
{
"cad"
:
{
"d1-2"
:
{
"1"
:
{
"count"
:
"06896"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d2-3"
:
{
"1"
:
{
"count"
:
"07430"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d3-4"
:
{
"1"
:
{
"count"
:
"06866"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d4-5"
:
{
"1"
:
{
"count"
:
"06413"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d5-6"
:
{
"1"
:
{
"count"
:
"08938"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d6-7"
:
{
"1"
:
{
"count"
:
"09057"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d7-8"
:
{
"1"
:
{
"count"
:
"07818"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d8-9"
:
{
"1"
:
{
"count"
:
"09126"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"d9-10"
:
{
"1"
:
{
"count"
:
"08498"
,
"num"
:
"1"
,
"type"
:
"via"
,
"min_tol"
:
"2.756"
,
"max_tol"
:
"0.984"
,
"finish_size"
:
"2.756"
,
"drill_size"
:
"2.756"
,
"slot_len"
:
"0"
,
"type2"
:
"laser"
,
"shape"
:
"hole"
,
"bit"
:
0
}
},
"drill"
:
{
"1"
:
{
"count"
:
"05"
,
"num"
:
"1"
,
"type"
:
"non_plated"
,
"min_tol"
:
"3.15"
,
"max_tol"
:
"3.15"
,
"finish_size"
:
"15.748"
,
"drill_size"
:
"15.748"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
},
"2"
:
{
"count"
:
"01"
,
"num"
:
"2"
,
"type"
:
"non_plated"
,
"min_tol"
:
"0"
,
"max_tol"
:
"1.969"
,
"finish_size"
:
"35.039"
,
"drill_size"
:
"35.039"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
},
"3"
:
{
"count"
:
"01"
,
"num"
:
"3"
,
"type"
:
"non_plated"
,
"min_tol"
:
"3.15"
,
"max_tol"
:
"3.15"
,
"finish_size"
:
"35.039"
,
"drill_size"
:
"35.039"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
},
"4"
:
{
"count"
:
"01"
,
"num"
:
"4"
,
"type"
:
"non_plated"
,
"min_tol"
:
"1.969"
,
"max_tol"
:
"1.969"
,
"finish_size"
:
"47.244"
,
"drill_size"
:
"47.244"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
},
"5"
:
{
"count"
:
"05"
,
"num"
:
"5"
,
"type"
:
"non_plated"
,
"min_tol"
:
"1.969"
,
"max_tol"
:
"1.969"
,
"finish_size"
:
"59.055"
,
"drill_size"
:
"59.055"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
},
"6"
:
{
"count"
:
"01"
,
"num"
:
"6"
,
"type"
:
"non_plated"
,
"min_tol"
:
"1.969"
,
"max_tol"
:
"1.969"
,
"finish_size"
:
"70.866"
,
"drill_size"
:
"70.866"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
},
"7"
:
{
"count"
:
"01"
,
"num"
:
"7"
,
"type"
:
"non_plated"
,
"min_tol"
:
"1.969"
,
"max_tol"
:
"1.969"
,
"finish_size"
:
"74.803"
,
"drill_size"
:
"74.803"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
}
}
},
"stp"
:
{
"d1-2"
:
{},
"d2-3"
:
{},
"d3-4"
:
{},
"d4-5"
:
{},
"d5-6"
:
{},
"d6-7"
:
{},
"d7-8"
:
{},
"d8-9"
:
{},
"d9-10"
:
{},
"drill"
:
{
"1"
:
{
"count"
:
"08"
,
"num"
:
"1"
,
"type"
:
"non_plated"
,
"min_tol"
:
"0"
,
"max_tol"
:
"1.969"
,
"finish_size"
:
"118.11"
,
"drill_size"
:
"118.11"
,
"slot_len"
:
"0"
,
"type2"
:
"standard"
,
"shape"
:
"hole"
,
"bit"
:
0
}
}
}
}
}
\ No newline at end of file
test/mytest.js
View file @
1dbd449a
...
@@ -8,507 +8,242 @@ var GEN = $.gen;
...
@@ -8,507 +8,242 @@ var GEN = $.gen;
var
GUI
=
$
.
gui
;
var
GUI
=
$
.
gui
;
var
Job
=
$
.
job
;
var
Job
=
$
.
job
;
var
JobId
=
$
.
job_id
;
var
JobId
=
$
.
job_id
;
var
Status
=
'ok'
;
var
drill_toll_manage
=
{}
var
resultData
=
[];
try
{
try
{
// var config = require("../config.js") // 读取配置文件 config
var
job
=
"sj"
;
var
cfg
=
IKM
.
select_value
({
table
:
'pub_conf'
,
field
:
'text_data'
,
where
:{
path
:
'cam/input_data'
}})
// 拿到框架中的系统配置
if
(
GEN
.
isJobExists
({
job
:
job
})){
if
(
!
cfg
||
cfg
==
""
){
throw
"cfg can not find"
}
GEN
.
closeJob
({
job
:
job
})
var
par
=
{
// ??? 通过某种方式拿到料号和客户名
GEN
.
deleteJob
({
job
:
job
})
job
:
"i4"
,
customer
:
"Customer_2"
// Customer_1 || Customer_2 || New_data
}
}
var
config
=
eval
(
cfg
)
var
config
=
{
var
job
=
par
.
job
||
Job
;
format
:
{
if
(
_
.
isEmpty
(
job
))
throw
"没有传入料号名!"
;
"Gerber274x_1"
:
{
job
=
job
.
toLowerCase
()
"nf1"
:
5
,
// 如果genesis已经存在这个料号
"nf2"
:
5
,
err
=
delSameJob
({
job
:
job
,
delSame
:
config
.
delSameJob
});
if
(
err
){
throw
err
};
"units"
:
"inch"
,
var
custCfg
=
config
.
customer
[
par
.
customer
]
"zeroes"
:
"leading"
,
if
(
!
custCfg
){
throw
"config error"
}
"decimal"
:
"no"
,
var
step
=
custCfg
.
step
.
toLowerCase
()
"nf_comp"
:
0
,
// 获取路径下文件信息
"break_sr"
:
"yes"
,
var
path
=
par
.
path
||
custCfg
.
path
"data_type"
:
"ascii"
,
var
pathInfo
=
fs
.
listDir
(
path
,
1
)
"separator"
:
"*"
,
// 判断存不存在料号文件
"threshold"
:
200
,
var
jobFile
=
pathInfo
.
filter
(
function
(
v
){
return
v
.
baseName
.
toLowerCase
()
==
job
})
"drill_only"
:
"no"
,
if
(
jobFile
.
length
==
0
){
throw
"job file is not exist"
}
"multiplier"
:
1
,
var
jobFiles
=
[]
// 记录要分析的文件
"resolution"
:
3
,
if
(
!
jobFile
[
0
].
isDir
)
{
"tool_units"
:
"inch"
,
jobFiles
.
push
(
jobFile
[
0
])
"coordinates"
:
"absolute"
,
}
else
{
"merge_by_rule"
:
"no"
,
jobFiles
=
fs
.
listDir
(
jobFile
[
0
].
path
)
"signed_coords"
:
"no"
,
"text_line_width"
:
0.0024
},
"Excellon2_1"
:
{
"nf1"
:
2
,
"nf2"
:
3
,
"units"
:
"inch"
,
"zeroes"
:
"none"
,
"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
}
}
// 分析料号文件 得到料号导入信息 导入类型
},
var
jobInfo
=
analyJobFiles
({
jobFiles
:
jobFiles
.
filter
(
function
(
v
){
return
v
.
isFile
}),
custCfg
:
custCfg
,
config
:
config
,
job
:
job
})
odb
:
[{
// IKM.msg(jobInfo.data.map(function(v){return v.format}))
vaild
:
function
(
item
){
if
(
jobInfo
.
data
.
length
==
0
){
throw
"file error"
}
return
/
\.
tgz$/ig
.
test
(
item
.
name
)
// 以.tgz结尾的
var
importOk
=
false
;
// 是否成功导入
if
(
/odb/ig
.
test
(
jobInfo
.
type
)){
// odb导入
if
(
jobInfo
.
data
.
length
==
1
){
// 只分析到一个tgz文件 直接导入
var
err
=
importJob
({
name
:
job
,
db
:
custCfg
.
db
,
path
:
jobInfo
.
data
[
0
].
file
.
path
},
config
.
delSameJob
)
if
(
err
){
throw
err
}
}
else
{
// 多个tgz文件 说明需要合并
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
]
var
arr_step
;
var
steplist
=
GEN
.
getStepList
({
job
:
arr_job
.
file
.
baseName
})
if
(
steplist
.
indexOf
(
arr_job
.
format
.
arrStep
)
<
0
){
arr_step
=
steplist
[
0
]
}
else
{
arr_step
=
arr_job
.
format
.
arrStep
}
GEN
.
openJob
({
job
:
job
});
GEN
.
openJob
({
job
:
arr_job
.
file
.
baseName
});
GEN
.
copyStep
({
// 合并
source_job
:
arr_job
.
file
.
baseName
,
source_name
:
arr_step
,
dest_job
:
job
,
dest_name
:
arr_step
,
});
GEN
.
closeJob
({
job
:
arr_job
.
file
.
baseName
});
GEN
.
deleteJob
({
job
:
arr_job
.
file
.
baseName
});
// 合并后 删除array的料号
}
}
importOk
=
true
}],
gerber
:
[
{
vaild
:
function
(
item
){
return
/
\.
art$/ig
.
test
(
item
.
name
)
// 以.art结尾的
},
type
:
"Gerber274x"
,
format
:
"Gerber274x_1"
},
{
vaild
:
function
(
item
){
return
/
\.
drl$/ig
.
test
(
item
.
name
)
// 以.drl结尾的
},
type
:
"Excellon2"
,
format
:
"Excellon2_1"
}
}
]
if
(
/gerber/ig
.
test
(
jobInfo
.
type
)){
// gerber导入
}
GEN
.
createJob
({
name
:
job
,
db
:
custCfg
.
db
})
var
path
=
"C:/Users/Administrator/Desktop/sj(1)"
GEN
.
createStep
({
job
:
job
,
name
:
step
})
var
gerberInfo
=
jobInfo
.
data
.
map
(
function
(
item
){
var
inputInfo
=
getJobInfo
({
path
:
path
,
job
:
job
,
config
:
config
})
var
gerberCfg
=
JSON
.
parse
(
JSON
.
stringify
(
item
.
format
));
var
file
=
item
.
file
if
(
/gerber/ig
.
test
(
inputInfo
.
type
)){
gerberCfg
.
layer
=
file
.
name
.
toLowerCase
()
inputInfo
.
data
.
forEach
(
function
(
file
){
gerberCfg
.
path
=
file
.
path
if
(
/
\.
drl$/ig
.
test
(
file
.
name
)){
gerberCfg
.
format
=
item
.
type
var
backUpName
=
file
.
name
+
".backup"
gerberCfg
.
job
=
job
// 备份
gerberCfg
.
step
=
step
fs
.
copyFile
(
file
.
path
,
file
.
dir
+
"/"
+
backUpName
)
return
gerberCfg
// 读取
var
data
=
fs
.
readFile
(
file
.
path
)
data
=
data
.
split
(
"
\n
"
)
var
head
=
getHead
(
data
)
var
body
=
data
// 解析head
var
headData
=
head
.
filter
(
function
(
v
){
return
/Holesize.+Tolerance.+PLATED/ig
.
test
(
v
)
})
})
GEN
.
COM
(
"input_manual_reset"
)
headData
.
map
(
function
(
v
){
gerberInfo
.
forEach
(
function
(
v
){
var
res
=
{
GEN
.
COM
(
"input_manual_set"
,
v
)
holesize
:
{},
tolerance
:
{},
attr
:
""
,
unit
:
""
,
quantity
:
0
}
var
holesize_tmp
=
/
(
Holesize.+
)
Tolerance/
.
exec
(
v
)[
1
];
holesize_tmp
=
holesize_tmp
.
split
(
"="
)
res
.
holesize
.
key
=
holesize_tmp
[
0
].
trim
()
res
.
holesize
.
value
=
holesize_tmp
[
1
].
trim
()
var
Tolerance_tmp
=
/
(
Tolerance.
{23})
/
.
exec
(
v
)[
1
];
Tolerance_tmp
=
Tolerance_tmp
.
split
(
"="
)[
1
].
split
(
"/"
)
res
.
tolerance
.
top
=
Tolerance_tmp
[
0
].
trim
()
res
.
tolerance
.
bot
=
Tolerance_tmp
[
1
].
trim
()
res
.
attr
=
/NON_PLATED/ig
.
test
(
v
)
?
"non_plated"
:
"plated"
res
.
unit
=
/MILS/ig
.
test
(
v
)
?
"inch"
:
"mm"
res
.
quantity
=
parseInt
(
v
.
split
(
"="
).
pop
())
if
(
!
drill_toll_manage
.
hasOwnProperty
(
file
.
name
)){
drill_toll_manage
[
file
.
name
]
=
{}
}
drill_toll_manage
[
file
.
name
][
/
(\d
+
)
/ig
.
exec
(
res
.
holesize
.
key
)[
1
]]
=
res
})
})
GEN
.
COM
(
"input_manual"
)
// 给body添加刀
importOk
=
true
var
count
=
0
;
body
=
body
.
filter
(
function
(
v
){
return
!
(
/T
\d
+/ig
.
test
(
v
))
})
body
.
forEach
(
function
(
v
,
i
){
if
(
/^%$|^M00/ig
.
test
(
v
)){
var
k
=
"T"
+
getK
(
++
count
)
body
[
i
]
=
v
+
"
\n
"
+
k
}
}
if
(
!
importOk
){
throw
"import error"
}
// 导入结束
var
matrix
=
GEN
.
getMatrix
({
job
:
job
});
comp
=
Object
.
keys
(
matrix
).
filter
(
function
(
v
){
// 如果有comp层 删除
return
/^comp_
\+
_/ig
.
test
(
v
)
})
})
if
(
comp
.
length
>
0
){
// 写入文件
var
tmp
=
GEN
.
getStepList
({
job
:
job
})
var
resStr
=
head
.
join
(
"
\n
"
)
+
"
\n
"
+
body
.
join
(
"
\n
"
)
GEN
.
openStep
({
job
:
job
,
name
:
tmp
[
0
]})
fs
.
writeFile
(
file
.
path
,
resStr
)
GEN
.
COM
(
"delete_comp"
)
}
})
importGerber
({
job
:
job
,
step
:
"pcs"
,
db
:
"genesis"
,
data
:
inputInfo
.
data
})
// 导入后 修改 tool manager
var
stepList
=
GEN
.
getStepList
({
job
:
job
})
var
matrix
=
GEN
.
getMatrix
({
job
:
job
})
var
drill_layers
=
Object
.
keys
(
matrix
).
filter
(
function
(
v
){
return
matrix
[
v
].
layer_type
==
"drill"
})
stepList
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
})
drill_layers
.
forEach
(
function
(
layer
){
var
drill_tool_manage_info
=
drill_toll_manage
[
layer
]
var
drill_tool_keys
=
Object
.
keys
(
drill_tool_manage_info
).
sort
(
function
(
a
,
b
){
return
a
-
b
})
GEN
.
COM
(
"tools_tab_reset"
)
drill_tool_keys
.
forEach
(
function
(
key
){
var
val
=
drill_tool_manage_info
[
key
]
GEN
.
COM
(
"tools_tab_add"
,
{
num
:
key
,
type
:
/plated/ig
.
test
(
val
.
attr
)
?
"plate"
:
"nplate"
,
min_tol
:
Number
(
val
.
tolerance
.
top
),
max_tol
:
Number
(
val
.
tolerance
.
bot
),
finish_size
:
Number
(
val
.
holesize
.
value
),
drill_size
:
Number
(
val
.
holesize
.
value
)
})
})
GEN
.
COM
(
"tools_set"
,{
layer
:
layer
,
thickness
:
0
,
user_params
:
1
,
slots
:
"by_length"
})
})
GEN
.
closeStep
()
GEN
.
closeStep
()
})
}
}
return
"Done"
// !!!! tmp
}
catch
(
e
)
{
// GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
IKM
.
msg
(
e
)
// GEN.saveJob({ job: job });
return
"Error"
// GEN.checkInout({job:job,mode:"in"})
// GEN.closeJob({job:job})
return
'Done'
;
}
catch
(
error
)
{
GUI
.
msg
(
error
)
return
'Error'
;
}
}
function
delSameJob
(
props
){
function
getJobInfo
(
props
){
var
path
=
props
.
path
var
config
=
props
.
config
var
job
=
props
.
job
var
job
=
props
.
job
var
delSame
=
props
.
delSame
var
files
=
fs
.
listDir
(
path
)
if
(
GEN
.
isJobExists
({
job
:
job
})){
files
=
files
.
filter
(
function
(
v
){
return
v
.
isFile
})
// 过滤出文件
if
(
/^yes$/ig
.
test
(
delSame
)){
// 先判断是不是odb
if
(
GEN
.
isJobOpen
({
job
:
job
})){
GEN
.
closeJob
({
job
:
job
})
}
var
odbFiles
=
files
.
filter
(
function
(
file
){
// 拿到odb文件
GEN
.
deleteJob
({
job
:
job
})
return
config
.
odb
.
reduce
(
function
(
a
,
b
){
}
else
{
if
(
b
.
vaild
(
file
))
{
return
"job "
+
job
+
" exist"
a
=
true
}
}
}
return
a
}
},
false
)
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
})()
})
})
if
(
odbFiles
.
length
){
var
fileInfo
=
files
.
reduce
(
function
(
a
,
file
){
return
{
try
{
type
:
"odb"
,
rules
.
forEach
(
function
(
item
){
data
:
odbFiles
[
0
]
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
}
}
}
}
}
})
var
gerberFiles
=
files
.
filter
(
function
(
file
){
// 拿到odb文件
}
catch
(
info
)
{
return
config
.
gerber
.
reduce
(
function
(
a
,
b
){
a
.
push
(
info
)
if
(
b
.
vaild
(
file
)){
file
.
gerber
=
config
.
format
[
b
.
format
];
file
.
type
=
b
.
type
;
a
=
true
}
}
return
a
return
a
},[])
},
false
)
var
odbfiles
=
fileInfo
.
filter
(
function
(
item
){
return
/odb/ig
.
test
(
item
.
type
)})
})
if
(
odbfiles
.
length
==
0
){
if
(
gerberFiles
.
length
){
return
{
type
:
"Gerber"
,
data
:
fileInfo
}
}
else
{
return
{
return
{
type
:
"ODB
"
,
type
:
"gerber
"
,
data
:
odbf
iles
data
:
gerberF
iles
}
}
}
}
return
"none"
}
}
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
);
}
function
importGerber
(
props
){
// job db step
var
job
=
props
.
job
var
step
=
props
.
step
var
files
=
props
.
data
GEN
.
createJob
({
name
:
job
,
db
:
props
.
db
})
GEN
.
createStep
({
job
:
job
,
name
:
props
.
step
})
var
gerberInfo
=
files
.
map
(
function
(
item
){
var
gerberCfg
=
JSON
.
parse
(
JSON
.
stringify
(
item
.
gerber
));
gerberCfg
.
layer
=
item
.
name
.
toLowerCase
()
gerberCfg
.
path
=
item
.
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"
)
}
/*
function
getHead
(
arr
,
head
){
NAME:
head
=
head
||
[];
DESCRIPTION: ;
if
(
arr
[
0
]
!=
"%"
){
PARAMETER:
head
.
push
(
arr
.
shift
())
[
return
getHead
(
arr
,
head
)
{
}
else
{
name : 'path',
return
head
title : '资料路径',
type : 'LineEdit',
property : {tool_tip : '存放所有料号的文件夹路径,不需要进入到料号文件夹内'},
},
{
name : 'customer',
title : '客户配置',
type : 'LineEdit',
property : {tool_tip : '客户配置'},
},
{
name : 'config_path',
title : '配置地址',
type : 'LineEdit',
property : {tool_tip : '配置的路径'},
}
}
]
}
function
getK
(
count
){
VERSION_HISTORY:
return
count
<
10
?
"0"
+
String
(
count
)
:
String
(
count
)
V1.00 2020-04-15 Scott Sun
}
1.新版本
\ No newline at end of file
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 客户数据导入 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 料号 和 客户配置 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// 引入模块 包
// console.log("=============================================>input_start");
// console.log("=============================================>input_start");
// console.log("=============================================>input_start");
// console.log("=============================================>input_start");
// var $ = require('topcam.scriptfunc').argv();
// var fs = require('fs');
// var _ = require('lodash');
// var database = require("topsin.database");
// database.addConnection($.conf.database_conf, "DFM");
// var QDfm = database.query("DFM");
// if ($.conf.product_type == "aimdfm") {
// QDfm.updateRow({
// table: "pdm_aimdfm_task",
// data: {
// current_process_title: $.process_title
// },
// where: { id: $.task_id }
// });
// }
// var GEN = $.gen;
// var Job = $.job_name;
// var db = $.db
// var Status = 'ok';
// var resultData = [];
// var PAR = {};
// if ($.hasOwnProperty('script_parameter')){
// PAR = JSON.parse($.script_parameter);
// }
// if (!$.hasOwnProperty('config_path')){
// PAR.config_path = "cam/input_data"
// }
// try {
// var par = PAR;
// console.log(par);
// if(!par.hasOwnProperty("customer")){throw "未填写配置"}
// var cfg = db.query("",function(q){
// return q.selectValue({
// table:'pub_conf',
// field:'text_data',
// where:{path : par.config_path}
// })
// })
// if (!cfg || cfg == ""){throw "cfg can not find"}
// var config = eval(cfg)
// if(!config.hasOwnProperty("customer")){throw "config error"}
// var job = Job;
// if(_.isEmpty(job)) throw "没有传入料号名!";
// job = job.toLowerCase()
// console.log(typeof config)
// console.log("=================Job:"+job)
// throw "tmp"
// // 如果genesis已经存在这个料号
// err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
// var custCfg = config.customer[par.customer]
// if(!custCfg){throw "config error"}
// var step = custCfg.step.toLowerCase()
// // 获取路径下文件信息
// var path = par.path || custCfg.path
// var pathInfo = fs.listDir(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 })
// if(jobInfo.data.length == 0){throw "file error"}
// var importOk = false; // 是否成功导入
// if(/odb/ig.test(jobInfo.type)){ // odb导入
// if(jobInfo.data.length == 1){ // 只分析到一个tgz文件 直接导入
// var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob)
// if(err){throw err}
// } else { // 多个tgz文件 说明需要合并
// 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]
// var arr_step;
// var steplist = GEN.getStepList({job:arr_job.file.baseName})
// if(steplist.indexOf(arr_job.format.arrStep) < 0){
// arr_step = steplist[0]
// }else{arr_step = arr_job.format.arrStep}
// GEN.openJob({job:job});
// GEN.openJob({job:arr_job.file.baseName});
// GEN.copyStep({ // 合并
// source_job:arr_job.file.baseName,
// source_name:arr_step,
// dest_job:job,
// dest_name:arr_step,
// });
// GEN.closeJob({ job: arr_job.file.baseName });
// GEN.deleteJob({ job: arr_job.file.baseName }); // 合并后 删除array的料号
// }
// 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){ // 如果有comp层 删除
// 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})
// QDfm.updateRow({
// table: "pdm_aimdfm_task",
// data: {
// progress: 33.33
// },
// where: { id: $.task_id }
// });
// if (GEN.hasError()) {
// Status = 'error';
// resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
// return {
// status: Status,
// result_data: resultData
// };
// } else {
// resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
// return {
// status: Status,
// result_data: resultData
// };
// }
// }
// catch (e) {
// Status = 'error';
// resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
// return {status: Status, result_data: resultData};
// }
// 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/test.js
View file @
1dbd449a
/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-17 Scott Sun
1.新版本
HELP:
var
str
=
"-0.0001"
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 测试 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 测试 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"==================================test"
);
console
.
log
(
"==================================test"
);
console
.
log
(
"==================================test"
);
// 引入模块 包
console
.
log
(
Number
(
str
));
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
var
_
=
require
(
'lodash'
);
var
database
=
require
(
"topsin.database"
);
database
.
addConnection
(
$
.
conf
.
database_conf
,
"DFM"
);
var
QDfm
=
database
.
query
(
"DFM"
);
if
(
$
.
conf
.
product_type
==
"aimdfm"
)
{
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
current_process_title
:
$
.
process_title
},
where
:
{
id
:
$
.
task_id
}
});
}
var
GEN
=
$
.
gen
;
var
fs
=
require
(
"fs"
);
var
Job
=
$
.
job_name
;
var
db
=
$
.
db
var
Status
=
'ok'
;
var
resultData
=
[];
var
PAR
=
{};
if
(
$
.
hasOwnProperty
(
'script_parameter'
)){
PAR
=
JSON
.
parse
(
$
.
script_parameter
);
}
try
{
var
par
=
PAR
;
console
.
log
(
par
)
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
if
(
GEN
.
hasError
())
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"GEN错误!"
,
detail
:
[{
desc
:
_
.
join
(
GEN
.
STATUS
,
"
\n
"
)
}]
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
else
{
resultData
.
push
({
type
:
"info"
,
title
:
"操作完成, 请注意检查!"
});
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
catch
(
e
)
{
Status
=
'error'
;
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
{
status
:
Status
,
result_data
:
resultData
};
}
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