company-desktop
|
3afc2dd7c1
|
perf: 增加截面恢复路径的 Phase 0 计数器(Debug 探针)
按 pipe-section-region-performance-plan.md 的 Phase 0 落地。目的不是提速,而是先拿到
三个决定性数字,再判断截面缓存(Phase 1)到底值不值得做:
1) 每次截面恢复多贵(µs),一次开图共多少次;
2) 同一份 SAT 文本被重复恢复多少次(唯一 hash 数 / 模拟命中率)——直接决定缓存收益上限;
3) 临时文件写入次数与字节数(杀软扫描影响面),以及打开图纸时的回写次数。
改动:
- 新增 inc/SectionPerfCounter.h + CoreLibrary/SectionPerfCounter.cpp
- Scope(QPC 计时)+ NoteRegionText(FNV-1a 64 位 hash,统计唯一数与模拟命中)
+ NoteTempFile + NoteWriteBack + Dump/Reset
- 计数器实例放在函数内 static:CoreLibrary 是静态库且只被 CoreCommand 链接,
所以 CoreCommand.arx 里只有一份,两个入口共用
- AecDbEwPipeBase.cpp:RegionAcisInDwgInFields / RegionAcisoutDwgOutFields 接入
- CoreTools.cpp:StringToRegion 两个重载 / RegionToString 接入
- EarthWorm.cpp:注册 ENVIPERFDUMP / ENVIPERFRESET(仅 Debug)
- CoreLibrary/cmakelists.txt 加一个源文件
- 计划文档的 Phase 0 补上实际命令与采集项
开关:启动 CAD 前 set AEC_PERF_COUNTER=1;命令 ENVIPERFDUMP 打印并追加到
%TEMP%\aec_section_perf.txt,ENVIPERFRESET 清零。
Release 下 Enabled() 恒为 false,调用点只剩一次 bool 判断。
不改任何几何逻辑与存盘格式。
验证:R230 Debug 编译通过(CoreLibrary_BAL_REMOTE、CoreCommand_BAL_REMOTE,无新增 warning),
产物已自动部署到 c:\ShangHuaSoft\Envi3D-2026-M\R230\。
R190 未在本机编译(缺 v100 工具集);代码刻意只用 C++98 特性,控制台输出改走 %hs,
避开了 &wstring[0] 这类老 STL 上的写法问题。
尚未做 CAD 实测:需要开图后跑 ENVIPERFDUMP 才看得到数据。
|
2026-10-28 19:31:27 +08:00 |
|
company-desktop
|
0cb05b769f
|
perf: 缓存管线系统样式查询,管线/管件加载不再反复开库
AecDbEwPipe / AecDbEwFitting 的 dwgInFields 会给缺失的样式键回填
颜色/线型/线宽/图层(PR #87 引入),走 CoreTools 的 4 个 getter;
每个 getter 都新建 CUIISQLiteServer 开一次 Plumbing.db,内部又调
getCurrentPipeSysTblName 再开一次。单实体最多 16 次 sqlite3_open,
几百个实体的图纸即几千次串行开库;绘制路径(setInfo2Ent /
setInfo2Dc)同样走这 4 个 getter。
改为:一条 SQL 取全 COLOR/LINETYPE/LINEWIDTH/LAYNAME,结果按
「表名 + 系统名 + 中心线/外边线」做进程级缓存;表名本身按
getCurrentTrade() 缓存。首次 2 次开库,之后全部内存命中。
- 只改 CoreCommand/CoreTools.cpp,对外签名不变,192 处调用点全覆盖
(CoreLibrary / PipelineCmd / PipelineSpecCmd / HvacCmd)
- 缓存只存字符串,AcDbObjectId 仍按当前图纸每次现解析,多文档切换
不串图层/线型
- 保持原语义:库打不开时 getColorByPipeSys 返回 256、getLtByPipeSys
与 getLyByPipeSys 返回空 id、getLwByPipeSys 返回 0
- 缓存生命周期等于进程,改系统样式配置需重启生效;静态对象用故意
不释放的指针持有,避免 DLL 卸载期析构顺序问题
- getPipeColorBySystem 未动:它的 SQL 不带 PIPESYS 过滤,语义与这 4
个 getter 不同,且唯一调用点已被注释
编译验证:R190 Debug 下 AecRxBase / CoreCommand_BAL_REMOTE /
CoreLibrary_BAL_REMOTE / CoreImplement 全部通过。
|
2026-10-28 10:09:24 +08:00 |
|
company-desktop
|
4e658a8ae9
|
refactor: 水池截面中转文件改用 CoreTools::getTempFilePath
删除 Pool3dCmd/PoolSectionTemp.h,JMDBDlg、JMSJDlg、HZQTDlg 共 7 处
改为 CoreTools::getTempFilePath(_T("JMSJ_"), _T(".sat"), 目录)。
同时修 getTempFilePath 自身的问题:
- 传了有效父目录时 sParentPath 没有赋值,会拼出 "\JMSJ_xxx.sat"
- 父目录为空时仍对 pszParentPath 调 _taccess,参数可能是 NULL
- return sPath(); 语法错误
- objId 用 %lu 格式化 Adesk::ULongPtr,64 位下会截断,改 %I64u
temp-file-naming.md 同步改为介绍这个通用函数。
|
2026-10-22 10:06:51 +08:00 |
|
company-desktop
|
f80ec56189
|
fix: AcDbX3dSolid 正确性小修(失败留痕/缓存失效/GSMarker/死代码)
- StringToRegion 两个重载在 fixACISFormat 拒绝时打印长度与 SAT 首行,
原来完全静默,现场只表现为构件消失,无法定位
- ReCreate 统一失效绘制缓存:清 m_pSolidDraw、m_arRegionFaces、
m_pSubDMeshDraw。原来只有 AddMove/ResetMove/AddRotate/ResetRotate 清,
TransformBy/SetSolidData/SetOrgPoint 调完 ReCreate 后 Draw3d 仍画旧几何
- GSMarker 改用独立成员 m_nGSMarker,不再借用 m_sszPoint2ds。
后者在 kExtrude/kLoft/kSweep 里存断面/路径串,SetGSMarkerID 会覆盖成数字,
导致 ReCreate 静默失败、几何丢失
- 删除 GetDrawSubDMesh 中 return 之后的 28 行不可达代码
- GetDraw2d / ByJson 补注释说明现状
|
2026-10-21 15:31:27 +08:00 |
|
company-desktop
|
6e494aeb9e
|
fix: fixACISFormat 改为显式长度入参,修正 npos 与越界读
- 签名加 size_t nLen,内部用 std::string(pszReg, nLen) 构造,
不再依赖调用方 buffer 的结尾 '\0';StringToRegion(nLen, char*)
传入的 m_pSatBuffer 是 new byte[m_nSatLen],没有终止符,原写法会越界读
- 首行解析改用 substr(0, find('\n')),去掉 stringstream 对终止符的依赖
- pos == npos(数据里没有 '#')时返回 false,原写法 pos+1 溢出为 0,
substr(0,0) 得到空串却仍返回 true,调用方会写出 0 字节文件且无提示
- countOfRecord <= 0 时提前返回 false
|
2026-10-21 14:15:11 +08:00 |
|
company-desktop
|
3ba658ffc5
|
refactor: MakeTempSatPath 并入已有的 SAT 相关 namespace
- 不再为单个函数新建 namespace 块:把 SAT 相关的
find_nth_occurrence_reverse / fixACISFormat 整块上移到 RegionToString 之前,
MakeTempSatPath 并入同一块,文件内 namespace 块数由 7 回到 6
- 编码规范补充:优先复用已有 namespace,整个文件没有时才新建
|
2026-10-21 09:24:21 +08:00 |
|
company-desktop
|
27cd7111fb
|
chore: 补充编码规范——文件内私有函数用匿名 namespace
- CODEBUDDY.md 新增「编码规范」章节:只在一个 cpp 内使用的函数
放在该文件的匿名 namespace{} 中,不用文件级 static
- CoreTools.cpp 的 MakeTempSatPath 按新规范改为匿名 namespace
|
2026-10-21 09:18:09 +08:00 |
|
company-desktop
|
1c8068c8cf
|
fix: 临时 SAT 文件名唯一化并修正越界读
- RegionToString/StringToRegion/BodyToString/StringToFace 的临时文件名
由固定的 Region1/Region2/Region121/Region212/Region312.sat
改为 x3d_<PID>_<序号>.sat,多 CAD 实例或多线程并发时不再互相覆盖
- 读取缓冲区补 +1 零字节,修复 new char[len] 无结尾 0 导致的越界读
- 检查 file.Read 短读,失败时释放缓冲并返回空
- 用完即 DeleteFile,不残留临时文件
|
2026-10-21 09:06:36 +08:00 |
|
gjm
|
164968b62e
|
chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
|
2026-10-04 00:04:20 +08:00 |
|
gjm
|
345044cb46
|
初始化提交
|
2026-09-28 15:28:50 +08:00 |
|