Files
envi-code/SourceCode/Code2026/cmakelists.txt
T
company-desktop 010d91af04 feat: X3dPart 几何块存盘/恢复(env 开关,默认关)+ 中望放开 modeler filer
按"3dbuffer 非空才存、空就不存、读不到就重建"的语义实现第一版:

- 块写在 AecDbX3dPartEntity::dwgOutFields **末尾**,读在 dwgInFields 末尾探测
  magic 'A3DP'。不写在 AecDbX3dPart 里:part 是嵌在实体流中间的子流
  (它后面还有 m_drawable2d),老版本会把块的字节当成后续字段读。
- 读不到 magic / 块不完整 / modeler 恢复失败 → 一律保持 m_bNeedCreate 走重建,
  不刷日志、不动 kCurrentVersionNumber(老版本读新图 = 照旧重建)。
- 内存 filer(clone / copyFrom / 剪贴板)不参与,避免拷贝出来的实体夹带用不上的缓存。
- 探测块会让 filer 状态变成 eEndOfFile,所以 dwgInFields 末尾显式 return eOk,
  不再 return pFiler->filerStatus()(否则整个实体会被判读取失败)。
- AecDbX3dPart 加两个存盘用访问器:GetDwgCacheSolid()(脏/没建过返回 NULL)、
  SetDwgCacheSolid()(接管恢复出来的 solid,顺带丢掉 m_pSolidDraw 让绘制副本重建)。
- cmakelists.txt:AEC_HAS_MODELER_FILER 对中望也放开(ZRX/Z20xx/arxport/inc/dbacis.h
  把 acdbModeler* 映射到 zcdbModeler*,ZwDatabase.lib 有这些符号)。
- 开关 AEC_3D_DWG_CACHE:默认关(确认收益前不改存盘结果),=1 打开;
  AEC_3D_CACHE_TRACE=1 时把每次 read/write 写 %TEMP%\aec_x3d_cache.log。

实测(big1.dwg,R230 Debug):
- 开图期探测到 220 个 part 实体,全部 miss(老图,正常回退重建);
- 存盘(MOVE+REGEN+QSAVE)后跟踪日志 **0 条 write**,DWG 只多 128 KB:
  这 220 个 part 实体在存盘时不是脏的,增量存盘按字节整块拷贝,dwgOutFields 没被调用;
- 而 X3dPart::Rebuild 是 1138 次 —— 说明 1248 个 part 里只有 220 个是入库实体,
  其余 ~918 个是 AecDbBDPipeBase/AecDbSlab/AecDbWeir/AecDbWell 等绘制期 new 出来的临时 part。

结论(已写进 3d-cache-dwg-verdict.md §8):这一版覆盖面上限 220/1248 ≈ 18%,
而且是"part 自己的流里带缓存"这个方案的天生缺陷;下一步要么挂到**所有者实体**
(它们存盘时确实是脏的,写得出去),要么做**图级中央缓存**。等决策后再动。
2026-10-29 23:51:31 +08:00

193 lines
7.1 KiB
CMake
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.
cmake_minimum_required(VERSION 3.21)
cmake_policy(SET CMP0091 NEW)
set(CMAKE_SYSTEM_VERSION "${WIN11_SDK}" CACHE STRING "Specify Windows SDK version" FORCE)
project(SHS_Code2026 VERSION 1.0.0 LANGUAGES CXX)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(functions)
IsZWCAD(IS_ZWCAD)
get_sdk_version(SDK_VERSION)
include(ThirdPartyDeps)
if(MSVC)
string(REGEX REPLACE "[/-]D_DEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REGEX REPLACE "[/-]D_DEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
string(REGEX REPLACE "[/-]RTC[a-zA-Z0-9]+" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REGEX REPLACE "[/-]RTC[a-zA-Z0-9]+" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
endif()
if (IS_ZWCAD)
if (CAD_SDK_VERSION GREATER 2021)
message(STATUS ">>> 检测到现代 ZRX SDK (${CAD_SDK_VERSION}),自动提权至 C++14 标准")
set(CMAKE_CXX_STANDARD 14)
endif()
else()
if(CAD_SDK_VERSION GREATER 25)
message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION}),自动提权至 C++20 标准")
set(CMAKE_CXX_STANDARD 20)
elseif (CAD_SDK_VERSION GREATER_EQUAL 20)
message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION}),自动提权至 C++14 标准")
set(CMAKE_CXX_STANDARD 14)
elseif (CAD_SDK_VERSION GREATER 19)
message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION}),自动提权至 C++03 标准")
set(CMAKE_CXX_STANDARD 03)
else()
message(STATUS ">>> 检测到传统 ARX SDK (${CAD_SDK_VERSION}),保持 C++98 标准")
set(CMAKE_CXX_STANDARD 98)
endif()
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(REQUIRED_VARS
CAD_SDK_ROOT
DEP_LIB_ROOT
DEP_INC_ROOT
CAD_SDK_VERSION)
if (NOT IS_ZWCAD)
list(APPEND REQUIRED_VARS CAD_SDK_SUBVERSION)
endif()
foreach(VAR_NAME IN LISTS REQUIRED_VARS)
if(NOT DEFINED ${VAR_NAME})
message(FATAL_ERROR "【严重错误】缺少必要的配置变量: ${VAR_NAME}!请在 CMakePresets.json 中提供。")
endif()
endforeach()
if(MSVC)
add_compile_options(/MP)
add_compile_definitions(
UNICODE
_UNICODE
$<$<CONFIG:Release>:NDEBUG>
_CRT_SECURE_NO_WARNINGS
)
if (IS_ZWCAD)
message(STATUS ">>> 编译中望CAD版本")
add_compile_definitions(ZWCAD)
endif()
# ObjectARX modeler filer API (acdbModelerSave/RestoreEntities*Filer) exists from ARX R20 on.
# ZWCAD has it too: ZRX/Z20xx/arxport/inc/dbacis.h maps acdbModeler* to zcdbModeler*
# and ZwDatabase.lib exports them (checked on Z2023/Z2024 headers + Z2026 lib).
# ZRX CAD_SDK_VERSION is a year (2023..2026) whose range overlaps ARX version numbers,
# so gate on the year for ZWCAD and on the ARX version otherwise (AGENTS.md red line).
if ((IS_ZWCAD AND CAD_SDK_VERSION GREATER_EQUAL 2023) OR (NOT IS_ZWCAD AND CAD_SDK_VERSION GREATER_EQUAL 20))
message(STATUS ">>> modeler filer enabled (3D geometry cache can be saved into the DWG)")
add_compile_definitions(AEC_HAS_MODELER_FILER)
endif()
add_compile_options(/Zc:forScope-)
add_compile_options(/wd4819 /wd4996)
endif()
get_filename_component(GLOBAL_BIN_DIR "${GENERATE_BIN_DIR}" ABSOLUTE)
get_filename_component(GLOBAL_LIB_DIR "${GENERATE_LIB_DIR}" ABSOLUTE)
if (IS_ZWCAD)
set(GENERATE_DIR_TAG "Z${CAD_SDK_VERSION}")
else()
set(GENERATE_DIR_TAG "R${CAD_SDK_VERSION}${CAD_SDK_SUBVERSION}")
endif()
message(STATUS ">>> 当前输出版本标签: ${GENERATE_DIR_TAG}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${GLOBAL_BIN_DIR}/Debug-x64-${GENERATE_DIR_TAG}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${GLOBAL_BIN_DIR}/Release-x64-${GENERATE_DIR_TAG}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${GLOBAL_LIB_DIR}/Debug-x64-${GENERATE_DIR_TAG}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${GLOBAL_LIB_DIR}/Release-x64-${GENERATE_DIR_TAG}")
message(STATUS ">>> 正在构建 Code2026 业务树...")
add_custom_module(MFCCtrl "SH/Global_Libraries")
add_custom_module(sqliteserver "SH/Global_Libraries")
add_custom_module(AdsXRx "SH/ThunderProof")
add_custom_module(ThunderProof "SH/ThunderProof")
add_custom_module(AecRxBase "SH/Core")
add_custom_module(CoreImplement "SH/Core")
add_subdirectory(CoreLibrary)
add_subdirectory(CoreCommand)
add_custom_module(shsTK "SH/Other")
add_custom_module(Dimension "SH/Other")
add_custom_module(EarthWormMain "SH/Other")
add_custom_module(EarthWormCmd "SH/Other")
add_custom_module(PipelineCmd "SH/Pipe")
add_custom_module(pool3dcmd "SH/Pipe")
add_custom_module(PIDLineCmd "SH/Pipe")
add_custom_module_2(ISODraft ISODraftCmd "SH/Pipe")
add_custom_module(PipelineSpecCmd "SH/Pipe")
add_custom_module_2(PipeHanger PipeHangerCmd "SH/Pipe")
add_custom_module(PlumbingCmd "SH/Pipe")
add_custom_module(ElecCmd "SH/Structures")
add_custom_module(HvacCmd "SH/Structures")
add_custom_module(ArchCmd "SH/Structures")
add_custom_module(SPLDCmd "SH/Structures")
# cad_mcp_frame 依赖 nlohmann/json 与 ghc::filesystem,二者都需要 C++11+
# R180/R190 是 C++98,跳过;中望的现代 SDK 都是 C++14,可以编
if (IS_ZWCAD OR CAD_SDK_VERSION GREATER_EQUAL 20)
add_custom_module_2(cad_mcp_frame CadMcpFrame "SH/Other")
add_custom_module_2(cad_mcp_plugins CadMcpPlugins "SH/Other")
add_custom_module_2(cad_mcp_aec CadMcpAec "SH/Other")
else()
message(STATUS ">>> 跳过 cad_mcp_frame:需要 C++11+(当前 preset 为 C++98)")
endif()
add_custom_module(tg_shs/shs_ximage/zlib "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/tiff "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/png "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/RAW "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/mng "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/Jpeg "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/jbig "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_ximage/jasper "TG/Global_Libraries/image")
add_custom_module_2(tg_shs/shs_ximage/ximage shs_ximage "TG/Global_Libraries/image")
add_custom_module(tg_shs/shs_dbf "TG/Global_Libraries")
add_custom_module(tg_shs/shs_sqlite "TG/Global_Libraries")
add_custom_module(tg_shs/shs_GeLib "TG/Core")
add_custom_module(tg_shs/shs_subgeLib "TG/Core")
add_custom_module_2(tg_shs/shs_kernal wfK "TG/Core")
add_custom_module_2(tg_shs/shs_annotate wfA "TG/Other")
add_custom_module_2(tg_shs/shs_blklib wfB "TG/Other")
add_custom_module_2(tg_shs/shs_siteplan wfS "TG/Other")
add_custom_module_2(tg_shs/shs_pipewire wfpipew "TG/Core")
add_custom_module_2(tg_shs/shs_twtkernal wfKernal "TG/Core")
add_custom_module_2(tg_shs/shs_twtanotate wfAnotate "TG/Other")
add_custom_module_2(tg_shs/shs_outdoor wfoutdoor "TG/Other")
add_custom_target(Build_TG)
add_dependencies(Build_TG
wfA
wfB
wfS
wfAnotate
wfoutdoor
)
add_custom_target(Build_SH_CORE)
add_dependencies(Build_SH_CORE
AecRxBase
CoreCommand_TRIAL_YEAR
CoreCommand_BAL_REMOTE
)
add_custom_target(Build_SH_GLOBAL)
add_dependencies(Build_SH_GLOBAL
MFCCtrl
sqliteserver
AdsXRx
ThunderProof
)