按"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 自己的流里带缓存"这个方案的天生缺陷;下一步要么挂到**所有者实体** (它们存盘时确实是脏的,写得出去),要么做**图级中央缓存**。等决策后再动。
193 lines
7.1 KiB
CMake
193 lines
7.1 KiB
CMake
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
|
||
)
|