Files
envi-code/SourceCode/Code2026/cmakelists.txt
T
company-desktop 132615af42 feat: 新增 cad_mcp_aec 插件,让 agent 直接建/改 Envi3D 自定义实体
现象:cad_mcp_frame 的插件机制只能挂"纯 AcDb 层"的只读工具
(cad_mcp_plugins 不链接 CoreCommand,拿不到 AecDbEwPipe / AecDbXWall /
AecDbXSlab / AecDbColumn / AecDbBeam 这些类的实现),agent 没法改仓库的自定义实体。

改动:新建 SourceCode/Code2026/cad_mcp_aec,仍是普通 DLL(由 frame 运行时
LoadLibrary),但链接 CoreCommand_BAL_REMOTE(内含静态库 CoreLibrary),
因此可以 new / 修改这五类实体。cmake 照 PipelineCmd 的写法,并在顶层
cmakelists.txt 里挂在 cad_mcp_frame 同一处(C++11+ 才编,R180/R190 跳过)。

12 个工具(每个实体一个 create + 一个 update,外加 list/get):
  list_aec_entities / get_aec_entity
  create_aec_pipe   / update_aec_pipe
  create_aec_wall   / update_aec_wall
  create_aec_slab   / update_aec_slab
  create_aec_column / update_aec_column
  create_aec_beam   / update_aec_beam

单位约定:坐标与建筑尺寸用图纸单位;管道的 dn_mm / od_mm /
wall_thickness_mm 用毫米,内部按 AS_MUNIT 转米(与 BZGDDlg、AecPipeLineTool 一致)。
update_* 只改传入字段;管道只给一个端点时另一端沿用实体现有值。

实现上撞到三个坑,都已修:
1. MCP 工具在主线程消息里跑、不在命令上下文,写库必须先
   acDocManager->lockDocument(),否则 appendAcDbEntity 返回
   eLockViolation(0x140)。用 DocLock RAII 包起来。
2. 只读实体上取专业数据必须 GetSpecialtyData(AcDb::kForRead):
   该函数缺省参数是 kForWrite,第一次实现没注意,直接把 acad 崩了
   (%TEMP%\acminidump.dmp)。
3. SetSection() 会清掉 PIPE_THICK 等派生字段("只改 DN"会把壁厚清成 0);
   AecDbXSlab::SetRegionSlab(AcGePoint2dArray&) 内部连线不补闭合点,
   传点串必须自己首尾闭合。两处都按实测结果处理了。

验证方式:
- R230 Debug、Z2026 Debug 两个 preset 编译通过并自动部署
  (cad_mcp_aec.dll,12 个工厂函数 + g_mcpPluginApiVersion 都在导出表里)。
- AutoCAD 2020 实测(临时把工具合进部署目录的 cad-mcp-frame.json,测完还原):
  tools/list 返回 30 个工具;pcf_1.dwg 上 list 出 20 根管道;
  五种实体各建一次并用 get 读回参数一致;管道改 DN+单端点后壁厚保留;
  板改厚/标高生效;类型不匹配与非法 handle 返回 -32004 / -32002。
  详见 cad-mcp-aec.md 第 5 节的用例表。

已知限制:只支持这五类实体;新建实体要等一次 REGEN 才有 bbox;
工具没有事务包装;运行期工具描述需要把 cad-mcp-aec.json 的 tools 追加到
部署目录的 cad-mcp-frame.json(插件侧的 private_description 已内置同样的文案)。
2026-10-29 21:52:05 +08:00

183 lines
6.4 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()
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
)