refactor(panels): 删除 rowPoints/rowIterations 死列 + 提取 PaintPanelResampleRows
对应 Code_Review_Report §14.5 第 1 项与第 3 项。
第 1 项:删除 EdgePanelLayout::rowPoints / rowIterations(行数组 18 → 16)
- 写入方只有 AppendRow(推空矩形),读取方只有调试框 AddAll 与 PanelSlotKey 的 mix 循环,
绘制方零(旧式“点数 / 迭代次数”输入框早被滑块版 rowLevelTracks / rowIterTracks 取代)。
- 连带同步:AppendRow、调试框、缓存键、rowgeom 导出、panels/panelscroll 长度不变式、
文档里的列数(18/14 → 16/12)。
等价性由基线证伪,而不是靠人工 grep:
old lines = 983, new lines = 919
only in OLD = 64, only in NEW = 0
only-in-OLD lines NOT belonging to rowPoints/rowIterations = 0
即除被删两列外,其余 919 条键逐字节相同。
第 3 项(前半):提取 PlotView::PaintPanelResampleRows
- PaintPanelListRows 里 `if (resamplePanel) { …; continue; }` 共 132 行整块提取,
签名 (g, layout, rowIndex, laneIndex, ref, item);两个局部 lambda
(paintInfoRow 只读统计行 / paintInputRow 联动输入框)随之迁移。
- maxInterval / minInterval 两个纯拷贝局部量直接用 item.maxInterval / item.minInterval。
- 通用参数行(中心轴统计 + 两行滑块)未提取:需 9 个参数,签名比函数体更难读。
§14.5 第 2 项(完整结构合并)本轮不做,方案已定并写入文档:
- 列视图(PanelColumn<T>)方案否决:拷贝忘重绑 = 静默悬垂,需额外自检兜住;
- 若要做就做“vector<PanelRow> + 具名成员访问(无视图)”,242 处读点(127 处命中判定),
必须单独一轮。它属整洁性收益(漏推一列已被 AppendRow + 长度不变式挡住),不是紧急项。
验证
- make release:零 warning;785,408 → 784,896 B(−512);make debug 同样零 warning
- make -C Tools:零 warning
- UnitTests:checks=260 failed=0 cases=19
- OffscreenChecks -all:7 检查 / 127 断言全 PASS
- panels -mode compare:7 面板像素哈希 + 几何逐项不变(resample=2BFC74B3D9B3239C)
- rowgeom -mode compare:919 + 7 键,0 差异(基线已按 16 列重录)
- PlotViewPaint.cpp 5575 → 5565;PlotViewPanelPaint.cpp 1016 → 1020
文档:Plan §十、Progress 第 38 轮、Report §15、agent_mem 第 38 轮、Tools/README §4.4
This commit is contained in:
1 parent
353c553721
commit
f07ac74988
9 files changed
+384
-150
No files matched your search
@@ -345,7 +345,7 @@ namespace jdi
|
||||
// ---- 每一行 / 每一列 ----
|
||||
// ⚠️ **每一列只按自己的长度导出**,不要假设所有列等长:
|
||||
// 「自由标记」面板复用 `rowRefs` 表示"信号分组",只填
|
||||
// `rowNameRects` / `rowNameCloses`,其余 14 列**全为空**
|
||||
// `rowNameRects` / `rowNameCloses`,其余 12 列**全为空**
|
||||
// (这一点正是 `rowgeom` 第一次运行就抓出来的结构事实)。
|
||||
// 按 `rowRefs.size()` 统一索引会越界崩溃。
|
||||
const auto dumpRects = [&text, &key](const char* name, const std::vector<gd::RectF>& rects) {
|
||||
@@ -371,8 +371,6 @@ namespace jdi
|
||||
dumpRects("rowNameCloses", layout.rowNameCloses);
|
||||
dumpRects("rowTriangles", layout.rowTriangles);
|
||||
dumpRects("rowChecks", layout.rowChecks);
|
||||
dumpRects("rowPoints", layout.rowPoints);
|
||||
dumpRects("rowIterations", layout.rowIterations);
|
||||
dumpRects("rowStats", layout.rowStats);
|
||||
dumpRects("rowLevelTracks", layout.rowLevelTracks);
|
||||
dumpRects("rowLevelValues", layout.rowLevelValues);
|
||||
@@ -667,9 +665,9 @@ namespace jdi
|
||||
|
||||
// 不变式:行的几何数组必须与行数**形状一致**。
|
||||
//
|
||||
// ⚠️⚠️ 判据必须**按排版类别**区分 —— 旧版"18 个数组全部全等"是**错的**:
|
||||
// ⚠️⚠️ 判据必须**按排版类别**区分 —— 旧版"所有数组全部全等"是**错的**:
|
||||
// 「自由标记」面板复用 `rowRefs` 表示"信号分组",只填
|
||||
// `rowNameRects` / `rowNameCloses`,其余 14 列**必须为空**
|
||||
// `rowNameRects` / `rowNameCloses`,其余 12 列**必须为空**
|
||||
// (它真正的行在 `markerRows` / `markerGroups` 里)。
|
||||
// 这是 `rowgeom` 第一次带真实固定点运行时越界崩溃所暴露的结构事实。
|
||||
const PanelStyle rowStyle = PanelStyleOf(kind);
|
||||
@@ -685,13 +683,12 @@ namespace jdi
|
||||
else
|
||||
{
|
||||
const std::size_t parallelSizes[] = {
|
||||
layout.rowHeaders.size(), layout.rowNameRects.size(),
|
||||
layout.rowTriangles.size(), layout.rowChecks.size(),
|
||||
layout.rowPoints.size(), layout.rowIterations.size(),
|
||||
layout.rowStats.size(), layout.rowLevelTracks.size(),
|
||||
layout.rowLevelValues.size(), layout.rowLevelResets.size(),
|
||||
layout.rowIterTracks.size(), layout.rowIterValues.size(),
|
||||
layout.rowIterResets.size(), layout.rowInfoMaxInterval.size(),
|
||||
layout.rowHeaders.size(), layout.rowNameRects.size(),
|
||||
layout.rowTriangles.size(), layout.rowChecks.size(),
|
||||
layout.rowStats.size(), layout.rowLevelTracks.size(),
|
||||
layout.rowLevelValues.size(), layout.rowLevelResets.size(),
|
||||
layout.rowIterTracks.size(), layout.rowIterValues.size(),
|
||||
layout.rowIterResets.size(), layout.rowInfoMaxInterval.size(),
|
||||
layout.rowInfoMinInterval.size(), layout.rowIntervalField.size(),
|
||||
layout.rowFrequencyField.size()};
|
||||
for (const std::size_t size : parallelSizes)
|
||||
@@ -868,8 +865,6 @@ namespace jdi
|
||||
initial.rowNameRects.size(),
|
||||
initial.rowTriangles.size(),
|
||||
initial.rowChecks.size(),
|
||||
initial.rowPoints.size(),
|
||||
initial.rowIterations.size(),
|
||||
initial.rowStats.size(),
|
||||
initial.rowLevelTracks.size(),
|
||||
initial.rowLevelValues.size(),
|
||||
@@ -953,7 +948,7 @@ namespace jdi
|
||||
*
|
||||
* 为什么需要它(Code Review 报告 §13.6 建议 1):
|
||||
* * 像素哈希只能回答"有没有变化",回答不了"**哪一行哪一列**变了";
|
||||
* * `EdgePanelLayout` 仍是 18 个平行数组,任何"合并成单一 `PanelRow`"或
|
||||
* * `EdgePanelLayout` 仍是 16 个平行数组,任何"合并成单一 `PanelRow`"或
|
||||
* "重写布局算式"的重构都必须先能**逐项证明等价**;
|
||||
* * 面板改布局时的真实缺陷形态(某列读到别人的矩形)会让**成片的**行错位,
|
||||
* 而像素基线在面板互相重叠时还会被"下层露出"掩盖。
|
||||
|
||||
+1
-1
@@ -214,7 +214,7 @@ OffscreenChecks.exe -run panels -mode compare -out ..\Temp\tools\panel-before
|
||||
|
||||
* 列表式面板(均值/中心轴/弱峰/重采样/截取):`rowRefs[i]` = 第 i 行的信号;
|
||||
* 「自由标记」面板:`rowRefs[i]` = 第 i 个**信号分组**,真正的条目行在 `markerRows`,
|
||||
且只填 `rowNameRects` / `rowNameCloses`,其余 14 列**必须为空**。
|
||||
且只填 `rowNameRects` / `rowNameCloses`,其余 12 列**必须为空**。
|
||||
|
||||
所以判据按 `PanelStyleOf(kind).markerGroups` 分流(见 `Checks.cpp` 里 `panels` 的注释)。
|
||||
早先“18 列全等”的写法对 MARK 面板是**错的**,只因既有场景恰好未触发才没暴露。
|
||||
|
||||
Reference in new issue
Block a user