first commit
This commit is contained in:
@@ -0,0 +1,291 @@
|
||||
# 二维图线条归一化与合并流程
|
||||
|
||||
本文档描述 AutoCAD DWG 线条与 SolidWorks 工程图线条匹配前的归一化流程。目标是把 AutoCAD 中被拆碎、重复、部分重叠的线条整理成稳定的二维几何基元,避免因为 DWG 表达方式不同导致匹配率失真。
|
||||
|
||||
## 目标
|
||||
|
||||
二维图匹配不直接依赖 AutoCAD 原始实体数量,而是依赖归一化后的几何覆盖情况。
|
||||
|
||||
主要判定依据包括:
|
||||
|
||||
- 图元类型
|
||||
- 尺寸数值
|
||||
- 方向信息
|
||||
- 几何位置
|
||||
- 覆盖长度
|
||||
- 匹配到 SolidWorks 工程图线条的数量和比例
|
||||
|
||||
## 输入
|
||||
|
||||
AutoCAD 提取器输出的原始实体,包括:
|
||||
|
||||
- `Line`
|
||||
- `Polyline`
|
||||
- `Circle`
|
||||
- `Arc`
|
||||
- `Spline`
|
||||
- `Hatch`
|
||||
- `Dimension`
|
||||
- `Text`
|
||||
- `BlockReference`
|
||||
|
||||
每个实体需要尽量保留:
|
||||
|
||||
- `handle`
|
||||
- `object_name`
|
||||
- `layer`
|
||||
- `linetype`
|
||||
- `color`
|
||||
- `lineweight`
|
||||
- 几何坐标
|
||||
- 尺寸/文字内容
|
||||
|
||||
## 输出
|
||||
|
||||
输出统一二维图元,例如:
|
||||
|
||||
```json
|
||||
{
|
||||
"kind": "line",
|
||||
"start": [10.0, 20.0],
|
||||
"end": [80.0, 20.0],
|
||||
"length": 70.0,
|
||||
"angleDeg": 0.0,
|
||||
"layer": "0",
|
||||
"linetype": "Continuous",
|
||||
"color": 256,
|
||||
"lineweight": -1,
|
||||
"sourceHandles": ["1A2", "1A3", "1A4"],
|
||||
"mergeCount": 3,
|
||||
"mergeType": "collinear_interval_union"
|
||||
}
|
||||
```
|
||||
|
||||
如果存在几何重叠但不能合并,则输出重叠关系:
|
||||
|
||||
```json
|
||||
{
|
||||
"overlapGroupId": "overlap-0001",
|
||||
"handles": ["1A2", "2B7"],
|
||||
"overlapLength": 20.5,
|
||||
"reason": "same_geometry_different_style"
|
||||
}
|
||||
```
|
||||
|
||||
## 总流程
|
||||
|
||||
1. 读取 AutoCAD 原始实体。
|
||||
2. 按实体类型转换成统一二维图元。
|
||||
3. 对 `Polyline` 展开成线段/圆弧片段。
|
||||
4. 对 `Line` 执行强合并。
|
||||
5. 对样式不同但几何重叠的线段记录重叠关系。
|
||||
6. 对 `Arc` / `Circle` 执行后续归一化和必要合并。
|
||||
7. 生成用于匹配的标准图元集。
|
||||
8. 和 SolidWorks 工程图显示线条进行匹配评分。
|
||||
|
||||
## 统一图元转换
|
||||
|
||||
### Line
|
||||
|
||||
转换为:
|
||||
|
||||
- `kind = line`
|
||||
- `start`
|
||||
- `end`
|
||||
- `length`
|
||||
- `angleDeg`
|
||||
- `sourceHandles`
|
||||
|
||||
方向角需要把反向线视为同一方向,例如 `0°` 和 `180°` 归为同一方向组。
|
||||
|
||||
### Polyline
|
||||
|
||||
不能把 `Polyline` 当作普通 `Line` 处理。
|
||||
|
||||
需要读取:
|
||||
|
||||
- 顶点坐标
|
||||
- bulge
|
||||
- closed
|
||||
- elevation
|
||||
|
||||
处理规则:
|
||||
|
||||
- bulge 为 `0` 的相邻顶点段转换成 `line`
|
||||
- bulge 非 `0` 的相邻顶点段转换成 `arc`
|
||||
- closed polyline 需要补最后一个点到第一个点的片段
|
||||
|
||||
### Circle
|
||||
|
||||
转换为:
|
||||
|
||||
- `kind = circle`
|
||||
- `center`
|
||||
- `radius`
|
||||
- `diameter`
|
||||
|
||||
### Arc
|
||||
|
||||
转换为:
|
||||
|
||||
- `kind = arc`
|
||||
- `center`
|
||||
- `radius`
|
||||
- `startAngle`
|
||||
- `endAngle`
|
||||
- `start`
|
||||
- `end`
|
||||
|
||||
### Spline
|
||||
|
||||
先保留为 `spline`,同时生成采样点串,用于后续几何匹配。
|
||||
|
||||
### Hatch
|
||||
|
||||
默认不参与轮廓线强匹配。
|
||||
|
||||
剖面线、填充线可以作为剖视区域辅助证据,但不能和普通模型轮廓线混合计数。
|
||||
|
||||
## Line 强合并规则
|
||||
|
||||
只做强合并,不做弱合并。
|
||||
|
||||
只有同时满足以下条件的线段才合并:
|
||||
|
||||
- 类型相同,都是 `line`
|
||||
- 方向一致或反向一致
|
||||
- 共线
|
||||
- 端点相接、间隙很小、完全重叠或部分重叠
|
||||
- 图层一致
|
||||
- 线型一致
|
||||
- 颜色一致或都为默认
|
||||
- 线宽一致或都为默认
|
||||
|
||||
如果几何上重叠,但图层、线型、颜色、线宽不同,则不合并,只记录 overlap 关系。
|
||||
|
||||
## 共线分组
|
||||
|
||||
### 方向分组
|
||||
|
||||
先按方向角分组。方向角需要忽略正反方向:
|
||||
|
||||
```text
|
||||
normalizedAngle = angle % 180
|
||||
```
|
||||
|
||||
建议初始容差:
|
||||
|
||||
```text
|
||||
angleToleranceDeg = 0.5 ~ 1.0
|
||||
```
|
||||
|
||||
### 共线判断
|
||||
|
||||
在同一方向组内,判断线段是否落在同一条无限直线上。
|
||||
|
||||
判断条件:
|
||||
|
||||
- 两个端点到基准线的垂直距离都小于容差
|
||||
- 两条线的法向偏移小于容差
|
||||
|
||||
建议初始容差:
|
||||
|
||||
```text
|
||||
collinearDistanceTolerance = 0.01mm ~ 0.05mm
|
||||
```
|
||||
|
||||
具体容差应根据图纸单位、DWG 精度、导出质量调整。
|
||||
|
||||
## 区间合并
|
||||
|
||||
对每个“样式一致 + 共线”的线段组,执行一维区间合并。
|
||||
|
||||
步骤:
|
||||
|
||||
1. 选定该组方向向量 `u`。
|
||||
2. 把每条线段两个端点投影到 `u` 上。
|
||||
3. 得到一维区间 `[tMin, tMax]`。
|
||||
4. 按 `tMin` 排序。
|
||||
5. 合并重叠、包含、部分重叠、小间隙区间。
|
||||
6. 把合并后的区间端点反投影回二维坐标。
|
||||
|
||||
示例:
|
||||
|
||||
```text
|
||||
line A: [0, 50]
|
||||
line B: [20, 80]
|
||||
line C: [80.01, 120]
|
||||
```
|
||||
|
||||
如果间隙容差允许:
|
||||
|
||||
```text
|
||||
[0, 50] + [20, 80] + [80.01, 120] -> [0, 120]
|
||||
```
|
||||
|
||||
建议初始容差:
|
||||
|
||||
```text
|
||||
gapTolerance = 0.01mm ~ 0.05mm
|
||||
```
|
||||
|
||||
## 重叠但不合并
|
||||
|
||||
如果两条线几何上共线且区间重叠,但样式不同,则不合并。
|
||||
|
||||
需要记录:
|
||||
|
||||
- 重叠组 ID
|
||||
- 涉及的 handle
|
||||
- 重叠长度
|
||||
- 样式差异
|
||||
- 是否可能重复计数
|
||||
|
||||
原因是不同样式可能表达不同语义:
|
||||
|
||||
- 轮廓线
|
||||
- 中心线
|
||||
- 隐藏线
|
||||
- 剖面线
|
||||
- 辅助线
|
||||
|
||||
这些线即使几何重合,也不能简单合并成一个实体。
|
||||
|
||||
## 匹配评分建议
|
||||
|
||||
匹配时不要只看原始 AutoCAD 实体数量。
|
||||
|
||||
建议统计:
|
||||
|
||||
- `rawEntityCount`
|
||||
- `normalizedPrimitiveCount`
|
||||
- `mergedLineCount`
|
||||
- `sourceLineCount`
|
||||
- `matchedPrimitiveCount`
|
||||
- `matchedCoveredLength`
|
||||
- `expectedCoveredLength`
|
||||
- `overlapDuplicateLength`
|
||||
- `lineDirectionHistogram`
|
||||
- `dimensionValueMatchRate`
|
||||
|
||||
核心指标:
|
||||
|
||||
```text
|
||||
coveredLengthMatchRate = matchedCoveredLength / expectedCoveredLength
|
||||
primitiveMatchRate = matchedPrimitiveCount / expectedPrimitiveCount
|
||||
```
|
||||
|
||||
其中 `expected` 通常来自 SolidWorks 工程图显示线条。
|
||||
|
||||
## 当前不做的事情
|
||||
|
||||
当前阶段不做弱合并。
|
||||
|
||||
也就是说:
|
||||
|
||||
- 样式不同的重叠线不合并
|
||||
- 图层不同的重叠线不合并
|
||||
- 线型不同的重叠线不合并
|
||||
- 颜色/线宽明显不同的重叠线不合并
|
||||
|
||||
这些情况只记录 overlap 关系,匹配时用于避免重复计数或辅助解释。
|
||||
Reference in New Issue
Block a user