Files
mech-ai/tools/drawing-diagnostics/DRAWING_GEOMETRY_NORMALIZATION.md
2026-07-17 17:45:56 +08:00

292 lines
5.7 KiB
Markdown

# 二维图线条归一化与合并流程
本文档描述 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 关系,匹配时用于避免重复计数或辅助解释。