Files
envi-code/AGENTS.md
T
company-desktop 6559cdf6f5 docs: 记录 Phase 0 实测结果、AutoCAD 自动化实测环境与属性 key 的取舍
Phase 0 在本机跑通(big1.dwg / AutoCAD 2020 / R230 Debug,开图 108 s):

  RegionTexts=5641  UniqueHashes=2597  SimulatedHits=3044  HitRate=54.0%
  TempFiles=6773  TempBytes=9,341,125  WriteBacks=1140
  CoreTools::StringToRegion  2559 次  14.6 s  平均 5.7 ms  最长 321 ms
  EwPipe::RegionAcisIn       3082 次   8.3 s  平均 2.7 ms
  EwPipe::RegionAcisout      1140 次   2.3 s  平均 2.0 ms

结论:一次开图做 5641 次 SAT 恢复,共 22.9 s(约占 108 s 的 21%)。
此前基于 CPU 采样的估算只有 550~1000 次,低估了 5~10 倍——说明采样只能算占比,
算不出调用次数,这类结论必须靠计数器。
按 54% 命中率折算,Phase 1 缓存净省约 12 s(约 11%),并少约 4000 次临时文件写盘。

同时记录三个待追查项:命中率为何只有 54%、StringToRegion 为何比 RegionAcisIn 贵一倍、
开图期间为何回写 1140 次 SAT。

文档里补充了"用管子属性做 key"的思路与风险:属性相同则截面相同,业务上成立,
但不能单独当 key——DWG 里的 SAT 文本可能来自旧版本/旧路径/手工编辑的异形截面,
属性漏一项就会静默复用错误几何。若要做,采用 L1 内容 hash + L2 属性 key 的两级结构,
L2 命中后仍比对 textHash,不一致按 miss 处理;落地前先加一路属性 key 命中率计数比较。

另外新增 tools/run_acad_perf.ps1 并在 AGENTS.md 记录本机 CAD 实测环境:
acad.exe 路径、/p SHS-ENVI2026 启动参数、测试图纸、部署目录,
以及"PowerShell 5.1 把无 BOM 的 UTF-8 当 ANSI 读"这个坑(脚本保持 ASCII)。

验证:文档与脚本;脚本语法检查通过,本次实测就是用它的等价命令跑出来的。
2026-10-28 19:52:18 +08:00

75 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — Envi3D 2026(环境设计)
本文件由 pi 自动加载。**完整的项目说明在 `CODEBUDDY.md`**(构建、preset、加密双版本、模块分组、架构分层)。
动手改代码前先 `read CODEBUDDY.md`。这里只放 pi 环境差异和硬性红线。
## pi 环境说明
- 内置工具只有 `read` / `write` / `edit` / `bash`,**没有独立的 grep / glob / web 工具**:
搜索一律在 `bash` 里用 `rg`,联网靠 `curl` 或额外插件。
- 超长文件用 `read` 的 `offset` / `limit` 分段读:
`AecDbEwFitting.cpp` 17453 行、`AecDbEwEquipment.cpp` 14290 行、`AecDbEwPipe.cpp` 5002 行。
- 类名与文件名不一定一致,搜之前先 `rg -n "ACRX_DXF_DEFINE_MEMBERS" <文件>` 确认
(例:`AecDbSlab.cpp` 里的类叫 `AecDbXSlab`)。
## 红线(违反了会污染仓库或造成不可逆损坏)
1. **源码编码**:`SourceCode/Code2026/**/*.cpp|*.h` 必须是 **UTF-8 with BOM**;
`cmakelists.txt` / `CMakeLists.txt` 保持 ASCII 无 BOM。
中文写坏**不可逆**,只能 `git checkout HEAD -- <file>` 还原后重做。
2. **禁止新增或依赖 `.vcxproj` / `.sln`**(`StartApp/StartApp.sln` 是唯一例外)。
`cmake_output/` 下的 `*.vcxproj` 是构建产物,不要提交。
3. **不要直推 `main`**,推送走 `git push origin HEAD:refs/for/main/<分支名>` 触发评审。
4. commit message 用中文。
5. 文件内私有函数放**该文件已有的匿名 `namespace`**;不要写文件级 `static`,不要放头文件。
6. 平台判断用 `#ifdef ZWCAD`,**不要**只比较 `ARX` 版本号(ZRX 的 `ARX` 宏与 AutoCAD R 版本数值重叠)。
7. `Arx/`、`ZRX/`、`bin/`、`lib/`、`cmake_output/` 已被 gitignore,不要手动加进来。
## 动手前
- 本仓库**没有单元测试框架、没有 lint 配置**:验证方式 = 编对应 preset + 在 CAD 里加载实测。
- 大改动先读仓库根目录已有的分析文档(`*-review.md` / `*-plan.md` / `*-analysis.md`),
里面记录了很多"已经决定不做"的理由,别重复踩。
- 构建命令与 target 对照见 `CODEBUDDY.md`,或直接用 skill `build-arx`。
## 自动化 CAD 实测
可以无人值守跑一次「开图 → 执行命令 → 收结果 → 关进程」。本机环境:
| 项 | 值 |
| --- | --- |
| AutoCAD | `c:\Program Files\Autodesk\AutoCAD 2020\acad.exe`(= R23.0,对应 preset **R230**) |
| 启动参数 | `/p SHS-ENVI2026`(试验用 profile,会自动加载本仓库的 arx) |
| 测试图纸 | `e:\桌面\big1.dwg`(约 8 MB,一次开图 ≈ 108 s) |
| 部署目录 | `c:\ShangHuaSoft\Envi3D-2026-M\R230\`(Debug 构建会自动部署到这里) |
一键脚本:`tools/run_acad_perf.ps1`
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File tools\run_acad_perf.ps1
```
它的做法:写一个只含 `ENVIPERFDUMP` 的 `.scr`,用 `/b` 让 AutoCAD 在**图纸载入完成后**执行;
报告落 `%TEMP%\aec_section_perf.txt`;收完报告按 PID 结束**本次拉起的** acad,
脚本里不写 QUIT,所以不会弹保存对话框、不会回写图纸。
写这类 `.ps1` 时注意:**Windows PowerShell 5.1 把无 BOM 的 UTF-8 当 ANSI 读**,
带中文会直接语法错误——要么保存为 UTF-8 with BOM,要么脚本全用 ASCII(推荐)。
## 需要用户决策时
不要把问题打在终端里就停住——先跑 `tools/notify_decision.ps1`(用 `-MessageFile` 传中文),
发完 toast 再结束本轮。细则见 skill `notify-decision`。
## 仓库内 skill
| skill | 用途 |
| --- | --- |
| `build-arx` | 按 preset 编译、单 target、产物与部署路径 |
| `verify-utf8` | UTF-8 BOM 自检、写坏后的回滚 |
| `pr-flow` | 分支命名 / 中文 commit / `refs/for/main` 推送 |
| `analyze-big-entity` | 万行实体类的分析与改动套路 |
| `notify-decision` | 需要用户拍板时主动推送通知(桌面 toast / IM 机器人),不让他干等终端 |
使用说明(常用命令、会话管理、Windows 终端问题、多机同步、插件取舍)见 `pi-agent-setup.md`。