更新分析文档:E3 已修复,补充 E2/E4/E5 不改的原因

- 7.1 增加 E3 条目(PR #69);
- 7.4 由“未处理”改为“确认不改”,逐条写明原因;
- E2 重点说明:只在超长路径回退分支触发、需重构两个 DrawPipe 重载、
  真正的瓶颈是后续 N-1 次 booleanOper 合并,收益不划算。
This commit is contained in:
gjm committed 2026-10-25 19:20:00 +08:00
1 parent d329428791
commit 8bf914e6b6
1 file changed
+16 -3
+16 -3
View File
@@ -5,7 +5,7 @@
> 范围:`SourceCode/Code2026/AecRxBase/GiDrawUtility.cpp`(965 行)、`SourceCode/Code2026/inc/GiDrawUtility.h`。
> 关联:`EarThwormDef.h`(EQUAL_ZERO 等宏)、`inc/memOper.h`(DELETE_PTR 模板函数,经 `KTCad.h` 的 `using namespace MemOper;` 引入)。
>
> 状态(2026-10-25):L1-L7、B1-B5、B7、B9、S1 已修复并合并(PR #62 / #64 / #65 / #67);B6、B8、B10、B11、S2 确认不改;S3 复核为误判。详见第 7 节。文中行号为分析时的 main,修复后已偏移。
> 状态(2026-10-25):L1-L7、B1-B5、B7、B9、S1、E3 已修复并合并(PR #62 / #64 / #65 / #67 / #69);B6、B8、B10、B11、S2 与效率项 E2、E4、E5 确认不改;S3 复核为误判。详见第 7 节。文中行号为分析时的 main,修复后已偏移。
## 1. 背景与影响面
@@ -166,6 +166,7 @@ if (!pReg) { _pC->setColorIndex(1); AddToModelSpace(_pC); return NULL; }
| B7 | `DrawPipe(pCurve, dR)` 检查 `getStartPoint` 返回值 | PR #67 |
| B9 | `DrawDish` 除零、`DrawCirTorus`/`DrawRectTorus` 负半径、零长管道、非正半径 | PR #67 |
| S1 | `spliteCurve`、`deleteContainerOfArx` 由文件级 `static` 移入匿名 namespace | PR #67 |
| E3 | `transfromRegion` 把旋转与平移合成一个矩阵,region 只做一次 `transformBy` | PR #69 |
E1 随 L1 一并消除(不再对同一几何重复调用 `createFromCurves`)。
@@ -185,7 +186,19 @@ void DELETE_PTR(T *&ptr) { if (ptr != NULL) { delete ptr; ptr = NULL; } }
模板函数不存在悬垂 else 问题,本文件不受影响。`inc/AdsXRx/tsuperlist.h`、`tg_shs/inc/geo/tsuperlist.h` 的 `DELETE_PTR` 宏与 `Dimension/superlist.h` 的 `_DELETE_PTR_` 宏仍是 `if (ptr) { ... }` 形式,但与本文件无关,保持原样。
### 7.4 未处理(纯效率项)
### 7.4 效率项 E2 / E4 / E5:确认不改
E2(分段递归时每段重建模板 region)、E3(`transfromRegion` 两次 `transformBy`)、E4(`DrawPyramid`/`DrawTydf` 的恒等平移)、E5(`DrawSphere` 同轴 `rotateTo` 返回单位阵)——只影响性能,不影响正确性,暂不处理。
| # | 位置 | 不改的原因 |
| --- | --- | --- |
| E2 | `DrawPipe(pCurve, dR)` 与 `DrawPipe(pCurve, pRegion, ptCenInRgn)` 的分段回退分支 | 见下方说明 |
| E4 | `DrawPyramid` / `DrawTydf` 的 `mat.setToTranslation(ptBottom - kOrigin)` | 只有 `ptBottom` 恰在原点时才是恒等变换;要真正省掉得把四边形顶点改成直接 `addVertexAt` 传 3D 点,动的是台体截面构造,收益是省一次 4 顶点的 `transformBy`,不值得 |
| E5 | `DrawSphere` 的 `RotateAndMove(kZAxis, kOrigin, kZAxis, ptCenter)` | 同轴 `rotateTo` 返回单位阵,剩余的是纯平移;但这里只多算一个矩阵乘法,不是 ACIS 变换,收益可忽略 |
**E2 为什么不做**:
1. **触发面很窄**。只有 `extrudeAlongPath` 失败时才进这个分支——即路径长超过 120000 或体量超过 12000(CAD 对拉伸/扫掠体的限制)。普通管段(几米)永远走不到,`spliteCurve` 也就不会把路径切段。
2. **改造成本不小**。要复用截面,必须先把“用给定截面沿曲线扫掠”抽成一个不带重试逻辑的内部函数,然后把两个 `DrawPipe` 重载里的两份近乎相同的回退代码一起改过去,属于结构性重构,不是局部优化。
3. **收益比看上去小**。省掉的是 N−1 次 `createFromCurves`;但每段仍要做 `clone` + `transformBy`(同样是 ACIS 操作)+ `extrudeAlongPath`,而该分支真正的大头是后面 N−1 次 `booleanOper(kBoolUnite)` 把各段合并成一个实体——E2 完全碰不到这一块。即使把 region 建一次,整体耗时也不会明显下降。
结论:收益/风险不划算。等真的遇到长路径布管卡顿,先用实测确认瓶颈落在 `createFromCurves` 还是 `booleanOper`,再决定是否重构;按目前的判断,大概率是后者。