company-desktop
|
d6614a44d5
|
feat: 阀门插入——参数化阀门 + 定制阀门(两种都做成 MCP 工具)
一、参数化阀门(P3_CR* 19 个命令)
命令链:P3_CRZF -> initParamPipeValveJsonData("闸阀") -> PL_wValveEx("闸阀",…,false)
-> startForPipeValve(...) -> 里面 dlg.DoModal()(弹"参数化设计"对话框)-> start2Ptr。
产品自己是 LoadLibrary + GetProcAddress 调 pool3dcmd.arx 导出的 startForPipeValve,
所以我们也照做,但用新增的无界面版 startForPipeValveNoUI(不 DoModal)。
Pool3dCmd 里两处小改造(不改原命令行为):
1. 把 startForPipeValve 里"DoModal 之前"的准备逻辑抽成 PreparePipeValveDlg(..., bSilent),
有界面/无界面共用;bSilent=true 时不弹 AfxMessageBox(MCP 里弹框会卡死调用方)。
2. 把"点确定"里填 m_datas/m_Bims 的那段抽成 CParaDesignDlg::BuildDatas(),
无界面版在 start2Ptr 之前也调一次 —— VALVE::start2Ptr 里 getDatasByDlg 读的就是 m_datas,
不填直接返回 NULL(这是第一版失败的真因)。
二、定制阀门(PL_CR* 20+ 命令)
不搬代码:照命令的做法查 sys/Aec3DMep.db -> aec_class(类别) -> aec_package(name like %DN<n>%)
-> select package 的 blob 落成临时 .equ -> AecDbEwEquipment::ReadFromFile。
注意 Aec_Class.Class 存的是多级路径(如 "管路附件\闸阀"),要用
class='<类别>' or class like '%\<类别>' 匹配末级,用等号查不到(第一版就栽在这)。
三、共同部分
SetInsert(pt, vtDir)(给 pipe 时位置投影到管轴、朝向取管轴)+ 图层 LAY_PIPE_OUTSIDE
+ 专业数据记 KEY_ASSOIC(所在管线) 与 PIPE_SYS(跟管线)。
工程改动:cad_mcp_aec 的 cmakelists 补链 sqliteserver(CUIISQLiteServer 要用,
CoreCommand 链了但不传递);源文件里先 #include "uiiado.h" 定义 TGADOSRV_API。
实测(R230 Debug,空图,DN100 给水管):
- 参数化闸阀 -> 31F
- 定制闸阀 -> 320,库里取到 Z45X(RVHX)弹性座封楔式闸阀DN100
工具总数 95 -> 97(本插件 67 -> 69),R230/Z2026 都编过。
限制:还没做插入时的"断管+法兰对接"(命令里的 InsertValAtInfPos 约 150 行),
阀门只是摆在管线上的位置与方向,管段不会自动断开。
|
2026-10-31 12:54:13 +08:00 |
|