Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
李娜
/
Line-Smart-Workstation
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit c941d69b
由
LN
编写于
2025-11-06 09:00:11 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
偏移角度可以配置小数。
1 个父辈
8e4e5914
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
63 行增加
和
34 行删除
DeviceLibrary/bean/BoardInfo.cs
DeviceLibrary/manager/XYConvertManager.cs
TSA-V/frmBoard/FrmMPcbConfig.cs
TSA-V/frmBoard/FrmPCbOffsetConfig.Designer.cs
TSA-V/frmBoard/FrmPCbOffsetConfig.cs
DeviceLibrary/bean/BoardInfo.cs
查看文件 @
c941d69
...
...
@@ -554,7 +554,7 @@ namespace TSA_V.DeviceLibrary
{
public
PcbOffsetInfo
()
{
}
public
PcbOffsetInfo
(
int
x
,
int
y
,
int
a
)
public
PcbOffsetInfo
(
int
x
,
int
y
,
double
a
)
{
this
.
X
=
x
;
this
.
Y
=
y
;
...
...
@@ -565,14 +565,13 @@ namespace TSA_V.DeviceLibrary
public
int
Y
{
get
;
set
;
}
public
int
A
{
get
;
set
;
}
public
double
A
{
get
;
set
;
}
}
// 兼容旧版数据格式的转换器:支持字符串 "x, y"、数组 [x,y,(a)]、对象 {X:x,Y:y,A:a}
public
class
PcbOffsetInfoConverter
:
JsonConverter
<
PcbOffsetInfo
>
{
// 序列化:将 A 保留一位小数输出
public
override
void
WriteJson
(
JsonWriter
writer
,
PcbOffsetInfo
value
,
JsonSerializer
serializer
)
{
if
(
value
==
null
)
...
...
@@ -586,10 +585,12 @@ namespace TSA_V.DeviceLibrary
writer
.
WritePropertyName
(
"Y"
);
writer
.
WriteValue
(
value
.
Y
);
writer
.
WritePropertyName
(
"A"
);
writer
.
WriteValue
(
value
.
A
);
// 关键:保留一位小数(四舍五入)
writer
.
WriteValue
(
Math
.
Round
(
value
.
A
,
1
));
writer
.
WriteEndObject
();
}
// 反序列化:适配不同格式的 A(支持 int/string/float 转 double)
public
override
PcbOffsetInfo
ReadJson
(
JsonReader
reader
,
Type
objectType
,
PcbOffsetInfo
existingValue
,
bool
hasExistingValue
,
JsonSerializer
serializer
)
{
if
(
reader
.
TokenType
==
JsonToken
.
Null
)
...
...
@@ -601,57 +602,81 @@ namespace TSA_V.DeviceLibrary
{
switch
(
reader
.
TokenType
)
{
// 1. 处理字符串格式(如 "x, y, a")
case
JsonToken
.
String
:
{
string
s
=
(
reader
.
Value
as
string
)
??
string
.
Empty
;
var
parts
=
s
.
Split
(
new
[]
{
','
,
';'
,
' '
},
StringSplitOptions
.
RemoveEmptyEntries
)
.
Select
(
p
=>
p
.
Trim
()).
ToArray
();
// X/Y 仍按 int 解析
int
x
=
parts
.
Length
>
0
&&
int
.
TryParse
(
parts
[
0
],
out
var
xi
)
?
xi
:
0
;
int
y
=
parts
.
Length
>
1
&&
int
.
TryParse
(
parts
[
1
],
out
var
yi
)
?
yi
:
0
;
int
a
=
parts
.
Length
>
2
&&
int
.
TryParse
(
parts
[
2
],
out
var
ai
)
?
ai
:
0
;
// 关键:A 改为 double 解析,保留一位小数
double
a
=
parts
.
Length
>
2
&&
double
.
TryParse
(
parts
[
2
],
out
var
ai
)
?
Math
.
Round
(
ai
,
1
)
:
0.0
;
return
new
PcbOffsetInfo
(
x
,
y
,
a
);
}
// 2. 处理数组格式(如 [x, y, a])
case
JsonToken
.
StartArray
:
{
var
arr
=
JArray
.
Load
(
reader
);
int
x
=
arr
.
Count
>
0
?
SafeInt
(
arr
[
0
])
:
0
;
int
y
=
arr
.
Count
>
1
?
SafeInt
(
arr
[
1
])
:
0
;
int
a
=
arr
.
Count
>
2
?
SafeInt
(
arr
[
2
])
:
0
;
return
new
PcbOffsetInfo
(
x
,
y
,
a
);
// 关键:A 用 SafeDouble 解析,保留一位小数
double
a
=
arr
.
Count
>
2
?
SafeDouble
(
arr
[
2
])
:
0.0
;
return
new
PcbOffsetInfo
(
x
,
y
,
Math
.
Round
(
a
,
1
));
}
// 3. 处理对象格式(如 {X:x, Y:y, A:a})
case
JsonToken
.
StartObject
:
{
var
obj
=
JObject
.
Load
(
reader
);
int
x
=
SafeInt
(
obj
[
"X"
]
??
obj
[
"x"
]);
int
y
=
SafeInt
(
obj
[
"Y"
]
??
obj
[
"y"
]);
int
a
=
SafeInt
(
obj
[
"A"
]
??
obj
[
"a"
]);
return
new
PcbOffsetInfo
(
x
,
y
,
a
);
// 关键:A 解析支持大小写键,保留一位小数
double
a
=
SafeDouble
(
obj
[
"A"
]
??
obj
[
"a"
]);
return
new
PcbOffsetInfo
(
x
,
y
,
Math
.
Round
(
a
,
1
));
}
// 4. 处理单值格式(极少场景,视为 X,Y=0,A=0.0)
case
JsonToken
.
Integer
:
case
JsonToken
.
Float
:
{
// 单值时,视为 X,Y/A = 0(极少出现,做兜底)
int
x
=
Convert
.
ToInt32
(
reader
.
Value
);
return
new
PcbOffsetInfo
(
x
,
0
,
0
);
return
new
PcbOffsetInfo
(
x
,
0
,
0
.0
);
}
default
:
return
new
PcbOffsetInfo
(
0
,
0
,
0
);
return
new
PcbOffsetInfo
(
0
,
0
,
0
.0
);
}
}
catch
{
// 解析失败兜底
,避免导入中断
return
new
PcbOffsetInfo
(
0
,
0
,
0
);
// 解析失败兜底
:A 设为 0.0
return
new
PcbOffsetInfo
(
0
,
0
,
0
.0
);
}
}
// 原有:安全解析 int(不变)
private
static
int
SafeInt
(
JToken
t
)
{
if
(
t
==
null
)
return
0
;
if
(
t
.
Type
==
JTokenType
.
Integer
)
return
(
int
)
t
;
if
(
t
.
Type
==
JTokenType
.
Float
)
return
(
int
)((
double
)
t
);
if
(
t
.
Type
==
JTokenType
.
Float
)
return
(
int
)
Math
.
Round
((
double
)
t
);
if
(
t
.
Type
==
JTokenType
.
String
&&
int
.
TryParse
((
string
)
t
,
out
var
v
))
return
v
;
return
0
;
}
// 新增:安全解析 double(适配 A 的 double 类型)
private
static
double
SafeDouble
(
JToken
t
)
{
if
(
t
==
null
)
return
0.0
;
if
(
t
.
Type
==
JTokenType
.
Integer
)
return
(
double
)
t
;
// int 转 double(如 5 → 5.0)
if
(
t
.
Type
==
JTokenType
.
Float
)
return
(
double
)
t
;
// 直接取 float/double 值(如 3.14 → 3.14)
if
(
t
.
Type
==
JTokenType
.
String
&&
double
.
TryParse
((
string
)
t
,
out
var
v
))
return
v
;
// 字符串转 double(如 "2.5" → 2.5)
return
0.0
;
}
}
}
DeviceLibrary/manager/XYConvertManager.cs
查看文件 @
c941d69
...
...
@@ -308,7 +308,7 @@ namespace TSA_V.DeviceLibrary
// 默认按均匀间距计算
int
dx
=
(
currC
-
1
)
*
pcbColValue
;
int
dy
=
(
currR
-
1
)
*
pcbRowValue
;
int
dA
=
0
;
//默认角度都是0
double
dA
=
0
;
//默认角度都是0
// 若设置了某个PCB相对PCB1的偏移,则覆盖默认值
try
{
...
...
@@ -449,7 +449,7 @@ namespace TSA_V.DeviceLibrary
// 默认按均匀间距计算
int
dx
=
(
currC
-
1
)
*
pcbColValue
;
int
dy
=
(
currR
-
1
)
*
pcbRowValue
;
int
dA
=
0
;
double
dA
=
0
;
// 若设置了某个PCB相对PCB1的偏移,则覆盖默认值
try
{
...
...
TSA-V/frmBoard/FrmMPcbConfig.cs
查看文件 @
c941d69
...
...
@@ -307,6 +307,7 @@ namespace TSA_V
// 如果有单独设置,则使用已设置的值
int
showDx
=
defDx
;
int
showDy
=
defDy
;
double
showA
=
0
;
try
{
if
(
currBoardInfo
!=
null
)
...
...
@@ -315,10 +316,12 @@ namespace TSA_V
if
(
index
==
1
)
{
showDx
=
0
;
showDy
=
0
;
// PCB1 固定为(0,0)
showA
=
0
;
}
else
if
(
p
.
X
!=
0
||
p
.
Y
!=
0
)
{
showDx
=
p
.
X
;
showDy
=
p
.
Y
;
showA
=
p
.
A
;
}
}
}
...
...
@@ -330,7 +333,7 @@ namespace TSA_V
lblPcbInfo
.
Margin
=
new
Padding
(
6
);
lblPcbInfo
.
AutoSize
=
false
;
lblPcbInfo
.
Font
=
new
Font
(
"微软雅黑"
,
12f
,
FontStyle
.
Bold
);
lblPcbInfo
.
Text
=
$
"PCB{index}(
{showDx},{showDy
})"
;
lblPcbInfo
.
Text
=
$
"PCB{index}(
X={showDx},Y={showDy},A={Math.Round(showA,1)
})"
;
lblPcbInfo
.
Tag
=
index
;
lblPcbInfo
.
Cursor
=
Cursors
.
Hand
;
lblPcbInfo
.
Click
+=
LabelPcb_Click
;
...
...
@@ -386,7 +389,7 @@ namespace TSA_V
int
defDy
=
r0
*
rowGap
;
int
currDx
=
defDx
;
int
currDy
=
defDy
;
int
currDA
=
0
;
double
currDA
=
0
;
try
{
var
p
=
currBoardInfo
.
GetPCBOffsetPoint
(
index
);
...
...
@@ -405,10 +408,10 @@ namespace TSA_V
{
int
x
=
dlg
.
OffsetX
;
int
y
=
dlg
.
OffsetY
;
int
a
=
dlg
.
OffsetA
;
double
a
=
dlg
.
OffsetA
;
currBoardInfo
.
SetPCBOffset
(
index
,
new
PcbOffsetInfo
(
x
,
y
,
a
));
// 更新标签显示
lbl
.
Text
=
$
"PCB{index}(
A={x},Y={y},A={a
})"
;
lbl
.
Text
=
$
"PCB{index}(
X={x},Y={y},A={Math.Round(a,1)
})"
;
try
{
if
(
FrmProjectorScreen
.
instance
!=
null
)
...
...
TSA-V/frmBoard/FrmPCbOffsetConfig.Designer.cs
查看文件 @
c941d69
...
...
@@ -132,18 +132,19 @@ namespace TSA_V.frmBoard
//
// numA
//
this
.
numA
.
DecimalPlaces
=
1
;
this
.
numA
.
Font
=
new
System
.
Drawing
.
Font
(
"微软雅黑"
,
9F
,
System
.
Drawing
.
FontStyle
.
Regular
,
System
.
Drawing
.
GraphicsUnit
.
Point
,
((
byte
)(
134
)));
this
.
numA
.
Location
=
new
System
.
Drawing
.
Point
(
158
,
104
);
this
.
numA
.
Maximum
=
new
decimal
(
new
int
[]
{
100000
,
this
.
numA
.
Increment
=
new
decimal
(
new
int
[]
{
5
,
0
,
0
,
0
});
this
.
numA
.
Minimum
=
new
decimal
(
new
int
[]
{
100000
,
65536
});
this
.
numA
.
Location
=
new
System
.
Drawing
.
Point
(
158
,
104
);
this
.
numA
.
Maximum
=
new
decimal
(
new
int
[]
{
36000
,
0
,
0
,
-
2147483648
});
131072
});
this
.
numA
.
Name
=
"numA"
;
this
.
numA
.
Size
=
new
System
.
Drawing
.
Size
(
160
,
23
);
this
.
numA
.
TabIndex
=
7
;
...
...
TSA-V/frmBoard/FrmPCbOffsetConfig.cs
查看文件 @
c941d69
...
...
@@ -8,13 +8,13 @@ namespace TSA_V.frmBoard
public
int
OffsetX
{
get
;
private
set
;
}
public
int
OffsetY
{
get
;
private
set
;
}
public
int
OffsetA
{
get
;
private
set
;
}
//角度
public
double
OffsetA
{
get
;
private
set
;
}
//角度
private
readonly
int
pcbIndex
;
private
readonly
int
defaultX
;
private
readonly
int
defaultY
;
private
readonly
int
defaultA
;
private
readonly
double
defaultA
;
public
FrmPCbOffsetConfig
(
int
pcbIndex
,
int
defaultX
,
int
defaultY
,
int
defaultA
)
public
FrmPCbOffsetConfig
(
int
pcbIndex
,
int
defaultX
,
int
defaultY
,
double
defaultA
)
{
this
.
pcbIndex
=
pcbIndex
;
this
.
defaultX
=
defaultX
;
...
...
@@ -27,7 +27,7 @@ namespace TSA_V.frmBoard
{
numX
.
Value
=
defaultX
;
numY
.
Value
=
defaultY
;
numA
.
Value
=
defaultA
;
numA
.
Value
=
(
decimal
)
defaultA
;
}
catch
{
}
...
...
@@ -37,7 +37,7 @@ namespace TSA_V.frmBoard
{
OffsetX
=
(
int
)
numX
.
Value
;
OffsetY
=
(
int
)
numY
.
Value
;
OffsetA
=
(
int
)
numA
.
Value
;
OffsetA
=
Math
.
Round
(
(
double
)
numA
.
Value
,
1
)
;
this
.
DialogResult
=
DialogResult
.
OK
;
this
.
Close
();
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论