ai.memory 的概览/构建/模块/约定与 CODEBUDDY.md 完全重复且已开始漂移, 03-worklog 的两条决策在 git log(086bb1c 等)中已有完整 Why。 删除 6 个文件,并清掉 CODEBUDDY.md 中对它的引用。
11 KiB
CODEBUDDY.md
This file provides guidance to CodeBuddy Code when working with code in this repository.
本文件是仓库内唯一的项目说明(原
ai.memory/已合并至此)。与代码不一致时以cmake/脚本和当前代码为准。
项目概览
- 产品:上海华软 Envi3D 2026(环境设计) —— CAD/BIM 机电(MEP)插件套件。
- 形态:ObjectARX / ZRX 插件(DLL,后缀
.arx/.zrx),运行在 CAD 宿主内,含大量 MFC 界面与自定义图元实体。 - CMake 项目名:
SHS_Code2026(version 1.0.0)。 - 主代码目录:
SourceCode/Code2026/(约 2900.cpp+ 3100.h;另有天正tg_shs/系列库)。 - 远端:
origin=ssh://git@39.107.55.179:222/gjm/envi-code.git(Gitea),主分支main。
目标平台(由 preset 与编译宏区分):
| 平台 | SDK | 版本 | 对应 CAD |
|---|---|---|---|
| AutoCAD | ObjectARX | R18 ~ R26 | CAD 2010 ~ 2027 |
| 中望CAD | ZRX | Z2023 ~ Z2026 | ZWCAD 2023 ~ 2026 |
构建
统一使用 CMake,不再使用 Visual Studio 工程文件(.vcxproj / .sln 已全部删除)。唯一例外:SourceCode/Code2026/StartApp/StartApp.sln(C# 启动器,独立于 CMake)。
所有命令在 SourceCode/Code2026/ 下执行(cmakelists.txt 与 cmakepresets.json 同目录):
cd SourceCode/Code2026
cmake --preset R250 # 配置(AutoCAD 2025-2026)
cmake --build --preset R250 --config Release # 编译
cmake --build --preset R250 --config Debug
cmake --build --preset R250 --config Release --target HvacCmd # 单模块
cmake --build --preset R250 --config Release --target Build_SH_CORE # 聚合目标
- 要求 CMake ≥ 3.21;生成器
Visual Studio 18 2026,架构x64,/MP多进程编译。 - preset 文件名是小写
cmakepresets.json(Windows 文件系统大小写不敏感,等价CMakePresets.json)。 - 工具集随 CAD 版本变化:
v143(R24x/R25x/R26x、Z202x)、v142、v141、v140、v110、v100、v90。 - C++ 标准在顶层
cmakelists.txt中按 SDK 版本自动切换:ARX >25 → C++20;ARX 20~25 与 ZRX >2021 → C++14;ARX >19 → C++03;更老 → C++98。 - 输出目录:
bin/Code2026/{Debug|Release}-x64-<标签>、lib/Code2026/...,标签为R<版本><子版本>或Z<版本>。 - 加密模块的产物再落到子目录
<PRODUCT>-<MODE>(如ENV_2025_V6_S0-BAL_REMOTE)。 - Debug 构建通过 post-build 调用
copyarx.exe,按sh_output_path.json(ACAD)/zw_output_path.json(中望)把产物部署到c:\ShangHuaSoft\Envi3D-2026-M。Release 不部署。
预设(cmakepresets.json,13 套 + 3 个 base)
| 分组 | preset |
|---|---|
| AutoCAD | R180 R190 R200 R210 R220 R230 R240 R243 R250 R260 |
| 中望CAD | Z2023 Z2024 Z2025 Z2026 |
继承链:base → acad_base / zwcad_base → 各版本 preset。关键 cache 变量:CAD_SDK_ROOT(../../arx/ 或 ../../zrx/)、DEP_LIB_ROOT / DEP_INC_ROOT(../dep_lib / ../dep_inc)、PRODUCT=ENV_2025_V6_S0、TRIAL_YEAR=2026、GENERATE_BIN_DIR / GENERATE_LIB_DIR。
顶层聚合目标
Build_TG→wfA wfB wfS wfAnotate wfoutdoorBuild_SH_CORE→AecRxBase+CoreCommand_TRIAL_YEAR+CoreCommand_BAL_REMOTEBuild_SH_GLOBAL→MFCCtrl sqliteserver AdsXRx ThunderProof
批量编译与打包(autoCompile/WF2026/)
batch_build.bat→python cmake_batch_build.py,读cmake_batch_build.json中的包定义,逐 preset 执行cmake --preset+cmake --build --preset --config release -j 8,日志写<preset>.log。- 打包:Inno Setup(
*.iss)+ Python(SHSCompile.py)+ 多个.bat,覆盖 ACAD/中望、1 年期/加密版,以及客户专版(中广核、国能集团)。如环境设计-ACAD-加密自动打包.bat、环境设计-中望-1年期自动打包.bat。
CMake 封装(cmake/functions.cmake)
add_custom_module(dir folder):add_subdirectory+ 以目录名作为 target 名并设 FOLDER;add_custom_module_2(dir target folder)用于目录名 ≠ target 名(如ISODraft→ISODraftCmd、tg_shs/shs_kernal→wfK)。target_link_objectarx(target EXT):链接 CAD SDK + 全局头ShsGlobalIncludes(inc/、inc/implement/),定义CMAKE、ARX=<版本>与模块导出宏(如HVACCMD_EXPORT)。simple_link_cad_sdk:按IsZWCAD()选择ThirdParty::ARX/ThirdParty::ZRX。add_def_file_name(SOURCES <Name>):向源列表追加<Name>.def/<Name>_zrx.def(导出acrxEntryPoint、acrxGetApiVersion)。target_set_name_and_suffix(target <Name> ".arx"):设置OUTPUT_NAME/SUFFIX,中望平台自动改.zrx。set_encryption_definitions_and_output_path(target MODE):授权模式,见下节。set_debug_post_build:调用copyarx.exe部署(仅 Debug)。cmake/ThirdPartyDeps.cmake:定义ShsGlobalIncludes与ThirdParty::ARX/ZRX/SQLite3/cURL/TG/modernGlue/BitAnswer等接口目标;按 SDK 版本条件追加库(acdrawbridge需 >19,acpal/acgeoment需 >23)。- 顶层
cmakelists.txt用add_custom_module注册全部模块并组织FOLDER(SH/Core、SH/Pipe…);CoreLibrary、CoreCommand走各自的add_subdirectory(因内部有双版本逻辑)。
授权 / 加密
CoreLibrary、CoreCommand通过get_encryption_modes()由同一套源码编译出两个目标:CoreCommand_BAL_REMOTE/CoreLibrary_BAL_REMOTE(网络锁 / 正式版)CoreCommand_TRIAL_YEAR/CoreLibrary_TRIAL_YEAR(1 年期试用版,Release 下定义TRIAL_YEAR=<年份>)
- 其它业务模块只链接
CoreCommand_BAL_REMOTE;CoreLibrary_${MODE}由加密模块内部引用。 - 依赖 BitAnswer(加密狗库);加密表由
utility/generateEncryptionTable生成。
架构
分三层:
- 实体层:
CoreLibrary定义海量自定义图元AecDbXxx(继承AcDbEntity),是数据模型核心;同时含绘图/分解/布尔等基础能力。 - 命令层:各
*Cmd模块实现 MFC 对话框 + Jig 交互 + ARX 命令注册(acrxEntryPoint→acedRegCmds->addCommand,命令组名各模块自定)。 - 链接关系:业务模块 →
AecRxBase/CoreCommand/sqliteserver/MFCCtrl。
模块在顶层 cmakelists.txt 中按 FOLDER 分组:
| FOLDER | 模块 | 职责 |
|---|---|---|
SH/Global_Libraries |
MFCCtrl, sqliteserver |
MFC 控件库;SQLite 数据服务 |
SH/ThunderProof |
AdsXRx, ThunderProof |
防雷接地设计 |
SH/Core |
AecRxBase, CoreImplement, CoreLibrary, CoreCommand |
核心基类、自定义实体、主命令 |
SH/Pipe |
PipelineCmd, PipelineSpecCmd, PIDLineCmd, ISODraft(→ISODraftCmd), PipeHanger(→PipeHangerCmd), PlumbingCmd, pool3dcmd |
管道/工艺/ISO 图/支吊架/给排水/水池 |
SH/Structures |
ArchCmd, ElecCmd, HvacCmd, SPLDCmd |
建筑/电气/暖通/道路 |
SH/Other |
shsTK, Dimension, EarthWormMain, EarthWormCmd |
通用工具、标注、主程序 |
TG/* |
tg_shs/* |
天正系列库 |
关键模块:
- CoreLibrary:数据模型核心(自定义实体
AecDbXxx),头文件在inc/与inc/implement/,被所有模块共享。 - AecRxBase:ARX 基类库(
AecDbEntityBase、AecDbCurveBase、Grip、双击编辑等)。 - CoreCommand:主命令集 + MFC 主界面/面板(BIM 面板、AI 助手
sh_ai.cpp/askaipaletteset.cpp)、PCF 导入导出(pcf.cpp、PcfIso.cpp);生成两种加密版本。 - CoreImplement:仅在 Debug 下链接(自定义实体的实现层)。
- StartApp:C# (.NET WinForms) 启动器,不走 CMake,保留独立
StartApp.sln。 - tg_shs/:天正系列(
shs_kernal→wfK、shs_twtkernal→wfKernal、shs_GeLib、shs_annotate→wfA、shs_twtanotate→wfAnotate、shs_blklib→wfB、shs_siteplan→wfS、shs_pipewire→wfpipew、shs_outdoor→wfoutdoor、shs_ximage/*图像库、shs_dbf、shs_sqlite等)。
新增模块约定
在模块目录放 CMakeLists.txt,并在顶层 SourceCode/Code2026/cmakelists.txt 用 add_custom_module(<相对目录> <FOLDER分组>) 注册。模板参考 HvacCmd/CMakeLists.txt:
add_library(<target> SHARED ${SOURCES})
add_def_file_name(SOURCES "<Name>")
target_set_name_and_suffix(<target> "<Name>" ".arx")
target_link_objectarx(<target> <XXX_EXPORT>)
target_precompile_headers(<target> PRIVATE StdAfx.h)
set_debug_post_build(<target> "<Name>" ".arx")
需要授权双版本时,参考 CoreCommand/cmakelists.txt 的 get_encryption_modes + foreach(MODE ...) + set_encryption_definitions_and_output_path 写法。
平台差异与注意事项
- 用
IsZWCAD()判断目标平台;ZRX 产物后缀自动变.zrx,链接ThirdParty::ZRX;ARX 链接ThirdParty::ARX。 - 编译宏:
ARX=<版本号>或ZWCAD;模块导出宏(*_EXPORT)由target_link_objectarx注入。 - 部分库仅在特定 SDK 版本可用(如
acdrawbridge需 >19,acpal/acgeoment需 >23),已在ThirdPartyDeps.cmake处理。 - 禁止新增或依赖
.vcxproj/.sln(StartApp除外)。cmake_output/下 CMake 生成的临时*.vcxproj是构建产物、已被 gitignore,不要误提交。 .gitignore忽略:Arx/、ZRX/、cmake_output/、bin/、lib/,以及*.obj/*.pdb/*.user/.vs/等 VS 中间产物。
源码编码(重要)
全部 SourceCode/Code2026/**/*.cpp|*.h 已统一为 UTF-8 with BOM(2026-10 一次性重编码,约 6000 个文件)。新增或修改的 .cpp/.h 必须保存为 UTF-8 BOM:
- 例外:
cmakelists.txt/CMakeLists.txt保持 ASCII、无 BOM。 - 改完自检:
python -c "print(open('f.cpp','rb').read(3))"应为b'\xef\xbb\xbf';再查raw.count(b'\xef\xbf\xbd'),非 0 说明中文已被写坏(不可逆),用git checkout HEAD -- <file>还原重做。 - 若遇到仍是 GBK/UTF-16 的老文件(从旧分支检出),先探明编码再改,不要假设。
测试 / 静态检查
本仓库没有单元测试框架(无 gtest/Catch2),也没有 lint 配置。验证方式是编译对应 preset,并在 CAD 中加载 .arx / .zrx 实测。
Git 协作
- 提交信息用中文。
- 远端是 Gitea,走 222 端口 SSH;各机器私钥不同,在本机
~/.ssh/config指定,不要把私钥文件名写进仓库。 - 推送到
main需经 PR:git push origin HEAD:refs/for/main/<分支名>触发评审,不要直接推main。