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
684776ec
Commit
684776ec
authored
Sep 14, 2020
by
Scott Sun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
scott
parent
ae709692
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
71 additions
and
220 deletions
+71
-220
scotttest.js
public_script/scotttest.js
+64
-212
silkScreenOptimize.js
public_script/silkScreenOptimize.js
+7
-8
index.js
驱动/index.js
+0
-0
No files found.
public_script/scotttest.js
View file @
684776ec
...
...
@@ -4,10 +4,10 @@ DESCRIPTION: ;
PARAMETER:
[
{
name : 'step
_filter
',
title : 'step
过滤
',
name : 'step',
title : 'step',
type : 'LineEdit',
property : {tool_tip : '
step 过滤,默认是unit
'},
property : {tool_tip : '
目标step,默认是orig
'},
},
{
name : 'auto_save',
...
...
@@ -24,16 +24,16 @@ PARAMETER:
]
VERSION_HISTORY:
V1.00 2020-0
4-28 Carver
V1.00 2020-0
9-01 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p>
删除重
孔 </p>
<p>
ol转
孔 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> </p>
<p>
step信息
</p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
...
...
@@ -42,7 +42,7 @@ PARAMETER:
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console
.
log
(
"=============================
>JTG_DRL_delete_duplicate_hole_aim
"
);
console
.
log
(
"=============================
=>template
"
);
// 引入模块 包
var
$
=
require
(
'topcam.scriptfunc'
).
argv
();
var
fs
=
require
(
'fs'
);
...
...
@@ -79,20 +79,19 @@ if (mode === "aimdfm") {
var
Status
=
'ok'
;
var
resultData
=
[];
var
drl_name
=
'drl'
try
{
var
par
=
PAR
;
var
default_par
=
{
step_filter
:
'unit'
,
units
:
'mm'
,
step
:
"unit"
,
auto_save
:
"No"
,
units
:
"mm"
,
rout
:
"ol"
}
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
+
"不存在"
}
...
...
@@ -101,133 +100,57 @@ try {
if
(
GEN
.
checkInout
({
job
:
job
,
mode
:
"test"
})
!=
0
){
throw
"the job check"
}
GEN
.
checkInout
({
job
:
job
,
mode
:
"out"
});
}
var
step
=
"unit"
var
font_layer
=
"gto_font"
// IKM.msg(GEN.getFeatures({job:job, step:"unit", layer:"1",options:"feat_index"}))
// GEN.selLayerFeat({layer:"1", index:"1",operation:"select"})
// 字符优化
// 1. 拷贝到辅助层 _1 _2 changesymbol r0.1 _1辅助层转铜皮
var
tmp1
=
font_layer
+
"_1"
;
var
tmp2
=
font_layer
+
"_2"
;
var
tmp3
=
font_layer
+
"_3"
;
var
tmp4
=
font_layer
+
"_4"
;
var
tmp5
=
font_layer
+
"_5"
;
var
bk
=
font_layer
+
"_bk"
;
[
tmp1
,
tmp2
,
tmp3
,
tmp4
,
tmp5
,
bk
].
forEach
(
function
(
v
){
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
v
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
v
]})}
var
steplists
=
GEN
.
getStepList
({
job
:
job
});
if
(
steplists
.
length
==
0
){
return
"该料号没有step"
}
steplists
=
steplists
.
filter
(
function
(
name
){
var
reg
=
new
RegExp
(
par
.
step
,
"ig"
)
return
reg
.
test
(
name
)
})
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
font_layer
,
dest_layer
:
tmp1
,
mode
:
"replace"
})
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
font_layer
,
dest_layer
:
bk
,
mode
:
"replace"
})
steplists
.
forEach
(
function
(
step
){
GEN
.
openStep
({
job
:
job
,
name
:
step
})
GEN
.
units
({
type
:
par
.
units
})
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
})
GEN
.
selClearFeature
()
GEN
.
workLayer
({
name
:
tmp1
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selChangeSym
({
symbol
:
"r0.1"
})
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
tmp1
,
dest_layer
:
tmp2
,
mode
:
"replace"
})
GEN
.
COM
(
"sel_contourize,accuracy=0,break_to_islands=yes,clean_hole_size=0,clean_hole_mode=x_and_y"
)
GEN
.
affectedLayer
({
affected
:
'no'
,
mode
:
'all'
})
GEN
.
clearLayers
()
// 2.
var
features
=
GEN
.
getFeatures
({
job
:
job
,
step
:
step
,
layer
:
tmp1
,
options
:
"feat_index"
})
var
indexes
=
[]
features
.
forEach
(
function
(
item
){
GEN
.
workLayer
({
name
:
tmp1
,
display_number
:
2
,
clear_before
:
'yes'
})
var
index
=
item
.
index
;
// 选中index 将它复制到tmp3 获取信息
GEN
.
selLayerFeat
({
layer
:
tmp1
,
index
:
index
,
operation
:
"select"
})
if
(
GEN
.
getSelectCount
()
>
0
){
item
.
limit
=
GEN
.
getLayerLimits
({
job
:
job
,
step
:
step
,
layer
:
tmp1
,
units
:
'mm'
,
options
:
"select"
})
}
GEN
.
workLayer
({
name
:
par
.
rout
,
display_number
:
2
,
clear_before
:
'yes'
})
var
feats
=
GEN
.
getFeatures
({
job
:
job
,
step
:
step
,
layer
:
par
.
rout
,
options
:
"feat_index"
})
// [{
// "type": "arc",
// "xs": "4.121787",
// "ys": "3.7740178",
// "xe": "4.1141847",
// "ye": "3.8220052",
// "xc": "3.7942278",
// "yc": "3.7467211",
// "symbol": "r7.874",
// "polarity": "positive",
// "direction": "cw",
// "attributes": []
// }]
feats
=
feats
.
filter
(
function
(
item
){
return
item
.
type
===
"arc"
&&
item
.
xs
===
item
.
xe
&&
item
.
ys
===
item
.
ye
})
function
surfaceAnalysis
(
props
){
props
.
limit
.
xmin
=
props
.
limit
.
xmin
-
0
;
props
.
limit
.
ymin
=
props
.
limit
.
ymin
-
0
;
props
.
limit
.
xmax
=
props
.
limit
.
xmax
-
0
;
props
.
limit
.
ymax
=
props
.
limit
.
ymax
-
0
;
props
.
limit
.
xsize
=
props
.
limit
.
xsize
-
0
;
props
.
limit
.
ysize
=
props
.
limit
.
ysize
-
0
;
props
.
xc
=
props
.
limit
.
xsize
/
2
+
props
.
limit
.
xmin
props
.
yc
=
props
.
limit
.
ysize
/
2
+
props
.
limit
.
ymin
}
var
xs
=
{};
var
ys
=
{};
features
.
forEach
(
function
(
item
){
surfaceAnalysis
(
item
)
indexes
.
push
({
index
:
item
.
index
,
xmin
:
item
.
limit
.
xmin
,
ymin
:
item
.
limit
.
ymin
,
xmax
:
item
.
limit
.
xmax
,
ymax
:
item
.
limit
.
ymax
,
xc
:
item
.
xc
,
yc
:
item
.
yc
feats
=
feats
.
filter
(
function
(
item
){
var
d
=
2
*
Math
.
sqrt
((
item
.
xe
-
item
.
xc
)
*
(
item
.
xe
-
item
.
xc
)
+
(
item
.
ye
-
item
.
yc
)
*
(
item
.
ye
-
item
.
yc
))
return
d
<=
6
})
if
(
!
ys
[
turnFix
(
item
.
yc
)]){
ys
[
turnFix
(
item
.
yc
)]
=
[]}
ys
[
turnFix
(
item
.
yc
)].
push
(
item
)
if
(
!
xs
[
turnFix
(
item
.
xc
)]){
xs
[
turnFix
(
item
.
xc
)]
=
[]}
xs
[
turnFix
(
item
.
xc
)].
push
(
item
)
feats
.
forEach
(
function
(
item
)
{
GEN
.
selLayerFeat
({
layer
:
par
.
rout
,
index
:
item
.
index
,
operation
:
"select"
})
})
var
limitinfo
=
[]
indexes
=
sameDirection
(
ys
,
"xc"
,
limitinfo
,
indexes
)
indexes
=
sameDirection
(
xs
,
"yc"
,
limitinfo
,
indexes
)
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
"_ok"
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
"_ok"
]})}
if
(
GEN
.
isLayerExists
({
job
:
job
,
layer
:
"_fail"
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:[
"_fail"
]})}
GEN
.
createLayer
({
job
:
job
,
layer
:
'_ok'
,
conext
:
'misc'
,
type
:
'document'
})
GEN
.
createLayer
({
job
:
job
,
layer
:
'_fail'
,
conext
:
'misc'
,
type
:
'document'
})
limitinfo
.
forEach
(
function
(
item
){
GEN
.
workLayer
({
name
:
bk
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
COM
(
"filter_area_strt"
)
GEN
.
COM
(
"filter_area_xy,x="
+
item
.
xmin
+
",y="
+
item
.
ymin
)
GEN
.
COM
(
"filter_area_xy,x="
+
item
.
xmax
+
",y="
+
item
.
ymax
)
GEN
.
COM
(
"filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=yes"
)
if
(
GEN
.
getSelectCount
()
>
0
)
{
GEN
.
selMoveOther
({
target_layer
:
'transform_temp'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
GEN
.
workLayer
({
name
:
"transform_temp"
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selTransform
({
mode
:
'anchor'
,
oper
:
'scale'
,
x_anchor
:
item
.
xmin
+
Math
.
abs
(
item
.
xmax
-
item
.
xmin
)
/
2
,
y_anchor
:
item
.
ymin
+
Math
.
abs
(
item
.
ymax
-
item
.
ymin
)
/
2
,
x_scale
:
1.2
,
y_scale
:
1.2
})
// 与成功层touch 有碰移动到失败层 没碰移动到成功层
GEN
.
selRefFeat
({
layers
:
"_ok"
,
use
:
"filter"
,
mode
:
"touch"
})
if
(
GEN
.
getSelectCount
()
>
0
)
{
GEN
.
selClearFeature
()
GEN
.
selMoveOther
({
target_layer
:
'_fail'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
}
else
{
GEN
.
selMoveOther
({
target_layer
:
'_ok'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
}
// npth move至drl
if
(
GEN
.
getSelectCount
()
>
0
)
{
GEN
.
selMoveOther
({
target_layer
:
'ol_tmp'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
GEN
.
workLayer
({
name
:
"ol_tmp"
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
COM
(
"cur_atr_set,attribute=.drill,option=non_plated"
)
GEN
.
COM
(
"sel_change_atr,mode=add"
)
GEN
.
selMoveOther
({
target_layer
:
'drl'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
GEN
.
deleteLayer
({
job
:
job
,
layer
:
"ol_tmp"
})
}
})
indexes
.
forEach
(
function
(
item
){
var
xc
=
item
.
xc
;
var
yc
=
item
.
yc
;
GEN
.
workLayer
({
name
:
bk
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
COM
(
"filter_area_strt"
)
GEN
.
COM
(
"filter_area_xy,x="
+
item
.
xmin
+
",y="
+
item
.
ymin
)
GEN
.
COM
(
"filter_area_xy,x="
+
item
.
xmax
+
",y="
+
item
.
ymax
)
GEN
.
COM
(
"filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=yes"
)
if
(
GEN
.
getSelectCount
()
>
0
)
{
GEN
.
selMoveOther
({
target_layer
:
'transform_temp'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
GEN
.
workLayer
({
name
:
"transform_temp"
,
display_number
:
2
,
clear_before
:
'yes'
})
GEN
.
selTransform
({
mode
:
'anchor'
,
oper
:
'scale'
,
x_anchor
:
xc
,
y_anchor
:
yc
,
x_scale
:
1.2
,
y_scale
:
1.2
})
// 与成功层touch 有碰移动到失败层 没碰移动到成功层
GEN
.
selRefFeat
({
layers
:
"_ok"
,
use
:
"filter"
,
mode
:
"touch"
})
if
(
GEN
.
getSelectCount
()
>
0
)
{
GEN
.
selClearFeature
()
GEN
.
selMoveOther
({
target_layer
:
'_fail'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
}
else
{
GEN
.
selMoveOther
({
target_layer
:
'_ok'
,
invert
:
'no'
,
dx
:
0
,
dy
:
0
,
size
:
0
})
}
}
})
// 保存
...
...
@@ -241,26 +164,13 @@ try {
}
if
(
mode
===
"aimdfm"
)
{
$
.
QDfm
.
updateRow
({
table
:
"pdm_aimdfm_task"
,
data
:
{
progress
:
33.33
},
where
:
{
id
:
$
.
task_id
}
});
$
.
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
};
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
};
return
{
status
:
Status
,
result_data
:
resultData
};
}
}
else
{
return
"Done"
...
...
@@ -272,61 +182,3 @@ try {
resultData
.
push
({
type
:
"error"
,
title
:
"脚本执行出错!"
,
detail
:
[{
desc
:
_
.
toString
(
e
)}]});
return
(
mode
===
"aimdfm"
)
?
{
status
:
Status
,
result_data
:
resultData
}
:
"Error"
;
}
\ No newline at end of file
function
sameDirection
(
xory
,
type
,
res
,
indexes
)
{
for
(
var
key
in
xory
)
{
var
current
=
-
1
;
var
data
=
xory
[
key
];
data
.
sort
(
function
(
a
,
b
){
return
a
[
type
]
-
b
[
type
]})
data
.
forEach
(
function
(
item
,
i
){
if
(
i
>
current
){
var
ret
=
[
item
];
current
=
searchFont
(
item
,
data
,
i
,
ret
,
type
)
if
(
ret
.
length
>
1
)
{
ret
.
forEach
(
function
(
item
)
{
indexes
=
indexes
.
filter
(
function
(
item2
){
return
item2
.
index
!=
item
.
index
})
})
res
.
push
(
ret
.
reduce
(
function
(
a
,
b
){
if
(
Number
(
b
.
limit
.
xmin
)
<
Number
(
a
.
xmin
)){
a
.
xmin
=
b
.
limit
.
xmin
}
if
(
Number
(
b
.
limit
.
ymin
)
<
Number
(
a
.
ymin
)){
a
.
ymin
=
b
.
limit
.
ymin
}
if
(
Number
(
b
.
limit
.
xmax
)
>
Number
(
a
.
xmax
)){
a
.
xmax
=
b
.
limit
.
xmax
}
if
(
Number
(
b
.
limit
.
ymax
)
>
Number
(
a
.
ymax
)){
a
.
ymax
=
b
.
limit
.
ymax
}
return
a
},{
xmin
:
item
.
limit
.
xmin
,
ymin
:
item
.
limit
.
ymin
,
xmax
:
item
.
limit
.
xmax
,
ymax
:
item
.
limit
.
ymax
}))
}
}
})
}
return
indexes
}
function
searchFont
(
l
,
arr
,
i
,
ret
,
type
){
if
(
arr
[
i
+
1
]){
var
len
=
Math
.
abs
(
l
[
type
]
-
arr
[
i
+
1
][
type
])
if
(
len
<=
1.5
){
ret
.
push
(
arr
[
i
+
1
])
return
searchFont
(
arr
[
i
+
1
],
arr
,
i
+
1
,
ret
,
type
)
}
else
{
return
i
}
}
return
i
+
1
}
function
turnFix
(
data
)
{
return
parseFloat
(
data
).
toFixed
(
2
)
}
\ No newline at end of file
public_script/silkScreenOptimize.js
View file @
684776ec
...
...
@@ -594,17 +594,16 @@ function slBoxOptimize(){
var
ref_layer
=
layerInfo
.
ref_layer
;
var
tmp1
=
'tl_script_tmp1'
,
tmp2
=
"tl_script_tmp2"
;
delLayer
([
tmp1
,
tmp2
]);
GEN
.
workLayer
({
name
:
work_layer
,
display_number
:
1
,
clear_before
:
'yes'
});
GEN
.
displayLayer
({
name
:
ref_layer
,
number
:
2
});
// 放大
var
ref_pad
=
"tmp_ref_pad"
;
delLayer
([
ref_pad
]);
GEN
.
createLayer
({
job
:
job
,
layer
:
ref_pad
,
context
:
'misc'
,
type
:
'document'
});
var
flag
=
true
;
IKM
.
msg
(
"
请选择需放大的文字框,不需制作了请【左键框选空白处】"
)
IKM
.
msg
(
work_layer
+
"层:
请选择需放大的文字框,不需制作了请【左键框选空白处】"
)
while
(
flag
){
var
tmp_con
=
GEN
.
MOUSE
({
type
:
'r'
,
text
:
"Please Select"
});
GEN
.
workLayer
({
name
:
work_layer
,
display_number
:
1
,
clear_before
:
'yes'
});
GEN
.
displayLayer
({
name
:
ref_layer
,
number
:
2
});
GEN
.
COM
(
"filter_area_strt"
)
GEN
.
COM
(
"filter_area_xy,x="
+
tmp_con
.
x1
+
",y="
+
tmp_con
.
y1
)
GEN
.
COM
(
"filter_area_xy,x="
+
tmp_con
.
x2
+
",y="
+
tmp_con
.
y2
)
...
...
@@ -641,9 +640,6 @@ function slBoxOptimize(){
GEN
.
selectByFilter
({
area_rect
:{
x1
:
layer_limits_tmp1
.
xmin
-
0.01
,
y1
:
layer_limits_tmp1
.
ymin
-
0.01
,
x2
:
layer_limits_tmp1
.
xmax
+
0.01
,
y2
:
layer_limits_tmp1
.
ymax
+
0.01
}});
GEN
.
selTransform
({
mode
:
'anchor'
,
oper
:
"rotate"
,
x_anchor
:
layer_limits_tmp
.
xc
,
y_anchor
:
layer_limits_tmp
.
yc
,
angle
:
angle
})
GEN
.
PAUSE
(
1
)
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
tmp1
,
dest_layer
:
tmp2
,
mode
:
'replace'
,
invert
:
'no'
});
var
text_tmp
=
'tl_tmp_text'
;
GEN
.
copyLayer
({
source_job
:
job
,
source_step
:
step
,
source_layer
:
tmp1
,
dest_layer
:
text_tmp
,
mode
:
'replace'
,
invert
:
'no'
});
...
...
@@ -760,6 +756,7 @@ function slBoxOptimize(){
GEN
.
displayLayer
({
name
:
work_layer
,
number
:
2
});
if
(
!
GEN
.
isLayerEmpty
({
job
:
job
,
step
:
step
,
layer
:
ref_pad
})){
GEN
.
displayLayer
({
name
:
ref_layer
,
number
:
3
})}
GEN
.
COM
(
'disp_on'
);
if
(
GEN
.
isLayerExists
({
job
:
job
,
step
:
step
,
layer
:
ref_pad
})){
GEN
.
deleteLayer
({
job
:
job
,
layer
:
ref_pad
})}
var
ans
=
GEN
.
PAUSE
(
'Please Check...'
);
if
(
!
/ok/ig
.
test
(
ans
)){
throw
"cancel"
}
GEN
.
COM
(
'disp_off'
);
...
...
@@ -918,9 +915,11 @@ function slOptimize() {
}
}
})
IKM
.
msg
(
layer
+
"层完毕,请确认,将正确的移动到_ok层"
)
GEN
.
PAUSE
(
"PAUSE"
)
GEN
.
workLayer
({
name
:
"_ok"
,
display_number
:
2
,
clear_before
:
'yes'
})
// 将ok的移动到文字层
})
})
}
...
...
@@ -1171,7 +1170,7 @@ function searchFont(l ,arr, i, ret, type){
return
i
+
1
}
function
turnFix
(
data
)
{
return
parseFloat
(
data
).
toFixed
(
2
)
return
parseFloat
(
data
).
toFixed
(
1
)
}
function
surfaceAnalysis
(
props
){
props
.
limit
.
xmin
=
props
.
limit
.
xmin
-
0
;
...
...
驱动/index.js
0 → 100644
View file @
684776ec
This source diff could not be displayed because it is too large. You can
view the blob
instead.
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