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)。 验证:文档与脚本;脚本语法检查通过,本次实测就是用它的等价命令跑出来的。
75 lines
4.0 KiB
Markdown
75 lines
4.0 KiB
Markdown
# 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`。
|