Files
envi-code/SourceCode/Code2026/CoreCommand/AecUIContextMenu.h
T
2026-09-28 15:28:50 +08:00

769 lines
29 KiB
C++

#pragma once
#include <vector>
#include <set>
#include "aecdbwall.h"
#pragma region define id
#define ID_CONTEXT_MENU_VIEW_TOP 130
#define ID_CONTEXT_MENU_VIEW_BOTTOM 131
#define ID_CONTEXT_MENU_VIEW_LEFT 132
#define ID_CONTEXT_MENU_VIEW_RIGHT 133
#define ID_CONTEXT_MENU_VIEW_FRONT 134
#define ID_CONTEXT_MENU_VIEW_BACK 135
#define ID_CONTEXT_MENU_VIEW_SWISO 136
#define ID_CONTEXT_MENU_VIEW_SEISO 137
#define ID_CONTEXT_MENU_VIEW_NEISO 138
#define ID_CONTEXT_MENU_VIEW_NWISO 139
#define ID_CONTEXT_MENU_ORBIT_3D 140
#define ID_CONTEXT_MENU_ORBIT_3DF 141
#define ID_CONTEXT_MENU_ORBIT_3DC 142
#define ID_CONTEXT_MENU_VSCURRENT_2 143
#define ID_CONTEXT_MENU_VSCURRENT_W 144
#define ID_CONTEXT_MENU_VSCURRENT_H 145
#define ID_CONTEXT_MENU_VSCURRENT_R 146
#define ID_CONTEXT_MENU_VSCURRENT_C 147
#define ID_CONTEXT_MENU_HIDE_SHOWALL 149
#define ID_CONTEXT_MENU_PL_DKBH 150
#define ID_CONTEXT_MENU_EXPORT_SWTT 151
static int cmd_start_id = 151;
#pragma endregion
#pragma region UIMenuItem
#define CONDI_PARAMS const AcDbObjectIdArray &ar, const AcGePoint3d &pt = AcGePoint3d::kOrigin
#define CONDI_PARAMS_IMP const AcDbObjectIdArray &ar, const AcGePoint3d &pt
/*
如何判断一个菜单是否显示?
鼠标右键是,反应器会把当前选择的实体id通过AcDbObjectArray传递过来
通过这些id可以判断菜单能否被显示.
可以通过一个函数,或者一个dxf过滤表+实体个数 两种方式来判断,
最省事的方法是直接放到选择集,让命令自己判断,但是这样会造成菜单数量爆炸.
宏使用说明
1.FC_CONDI_ 开头,说明用函数做过滤器,来判断注册的菜单是否显示,使用的话,
需要传入一个函数,用来判断菜单使用情况.
2.FT_CONDI_ 开头,说明用DXF做过滤器,来判断注册的菜单是否显示,使用的话,
需要传入dxf字符串,和实体个数,用来判断菜单使用情况.
实体个数如果小于0,说明需要多个实体,如果是-1,说明需要多个但至少要有1个
如果是-2,说明需要多个但至少要有2个
3._SIM,简单命名模式,真实命令名称与注册类名称一致.
4._FUL,全命名模式,适用于真实命令与注册类名称不一致的情况,参看"插入板" "设备标高" 等命令.
5._SENDER,只是发送命令,不会向命令传递任何数据.
6.FT_CONDI_N_ENT,这个宏注册的类只有在N个符合DXF表的情况下菜单才会显示,
并且发送命令是,会把N个实体,一个一个的组成resbuf传给命令,参看"合并管线"
7.FT_CONDI_PT_INS,这个宏负责在右键弹出菜单的点上插入一些实体,
会把这个点以resbuf的方式传给命令,参看端加弯头
8._EXE,表示需要重载 executeCommand 函数
9._COD,表示需要重载 eanbleCondition 函数
*/
class UIMenuItem
{
public:
enum Category
{
eNone = 0,
// 系统级别
eSys,
// 生成实体
eCr,
// 管线生成类
eCrPipe,
// 土建生成类
eCrStut,
// 暖通生成类
eCrHVAC,
// 电气生成类
eCrElec,
// 生成设备
eCrEqui,
// 管线设计
eDsPipe,
// 土建设计
eDsStut,
// 设备设计
eDsEqui,
// 暖通设计
eDsHVAC,
// 电气设计
eDsElec,
// 管件插入
eInsFitting,
// 插入参数阀门
eInsParamValve,
// 插入自定义阀门
eInsCustomValve,
// 土建标注
eDimStut,
// 系统标注
eDimSys,
// 视图操作
eOpView,
// 数据中心
eExport,
};
public:
UIMenuItem()
:m_iWeight(0)
, m_iCategory(eNone)
, m_sCommand(_T(""))
, m_idCommand(-1)
, m_sUIName(_T(""))
, m_bUsed(true)
, m_bUseSingleEntity(true) { }
UIMenuItem(const UINT_PTR &id)
:m_iWeight(0)
, m_iCategory(eNone)
, m_sCommand(_T(""))
, m_idCommand(id)
, m_sUIName(_T(""))
, m_bUsed(true)
, m_bUseSingleEntity(true) { }
UIMenuItem(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &weight
, const Category &cat )
:m_iWeight(weight)
, m_iCategory(cat)
, m_idCommand(id)
, m_sCommand(cmd)
, m_sUIName(name)
, m_bUsed(true)
, m_bUseSingleEntity(true) { }
UIMenuItem(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &weight
, const Category &cat
, const bool & bSingle)
:m_iWeight(weight)
, m_iCategory(cat)
, m_idCommand(id)
, m_sCommand(cmd)
, m_sUIName(name)
, m_bUsed(true)
, m_bUseSingleEntity(bSingle) { }
virtual ~UIMenuItem() {}
static CString getClassName(UIMenuItem *pItem);
static bool compareItems(const UIMenuItem *a, const UIMenuItem *b);
static bool compareItemsByCategory(const UIMenuItem *a, const UIMenuItem *b);
struct compareItemsById
{
bool operator()(const UIMenuItem *a, const UIMenuItem *b) const
{
if (!a || !b) return false;
return a->m_idCommand < b->m_idCommand;
}
};
static CString getCategoryName(const Category &cat);
static void BuildPickFist();
virtual bool eanbleCondition(const AcDbObjectIdArray &ar, const AcGePoint3d &pt);
virtual resbuf* executeCommand() const;
void addToMenu(const HMENU &hMenu, const int &idx) const;
template <typename T>
static bool isKindOf(const AcDbObjectId &id)
{
if (!id.isValid()) return false;
AcRxClass *pIdClass = id.objectClass();
if (pIdClass == NULL) return false;
AcRxClass *pTargetClass = T::desc();
return pIdClass->isDerivedFrom(pTargetClass);
}
template <typename T>
static bool isSameOf(const AcDbObjectId &id)
{
if (!id.isValid()) return false;
AcRxClass *pIdClass = id.objectClass();
if (pIdClass == NULL) return false;
AcRxClass *pTargetClass = T::desc();
return pIdClass == pTargetClass;
}
template <typename T>
static bool isKindOf(CONDI_PARAMS)
{
for (int i(0); i < ar.length(); ++i)
{
if (isKindOf<T>(ar[i]) == false)
return false;
}
return true;
}
// 实体数量必须大于1
template <typename T>
static bool isMoreKindOf(CONDI_PARAMS)
{
if (ar.length() < 2) return false;
for (int i(0); i < ar.length(); ++i)
{
if (isKindOf<T>(ar[i]) == false)
return false;
}
return true;
}
template <typename T>
static bool isOneAndKindOf(CONDI_PARAMS)
{
return (ar.length() == 1 && isKindOf<T>(ar.first()));
}
template <typename T1, typename T2>
static bool isOneAndKindOf(CONDI_PARAMS)
{
return ar.length() == 1
&& (isKindOf<T1>(ar.first())
|| isKindOf<T2>(ar.first()));
}
static bool idMatchFilter(const AcDbObjectId &id, LPCTSTR sFilter);
// 实体的dxf是否满足 Filter
static bool isFilterMacth(CONDI_PARAMS_IMP, LPCTSTR sFilter, const int &N);
// 是否是一个上华实体
static bool isOneSHEntity(CONDI_PARAMS);
// 是否全是上华实体
static bool isAllSHEntity(CONDI_PARAMS);
// 是否是一个闭合曲线
static bool isClosedPLine(CONDI_PARAMS);
// 能否快速修改
static bool canQModify(CONDI_PARAMS);
// 是否是一个阀门
static bool isOneValve(CONDI_PARAMS);
static bool isFlange(CONDI_PARAMS);
static bool isVertPipe(CONDI_PARAMS);
// 设备但不是阀门
static bool isEquButNoValve(CONDI_PARAMS);
// 符合 底板,楼板,盖板
static bool isSlab(CONDI_PARAMS);
// 符合斜底板
static bool isXSlab(CONDI_PARAMS);
// 是否从AecMInterfaces派生?
static bool isAecMInterfaces(const AcDbObjectId &id);
public:
// 命令名称
CString m_sCommand;
// 菜单名称
CString m_sUIName;
// 权重
int m_iWeight;
// 分类
Category m_iCategory;
// 选择的实体 (目前可记录可不记录,因为都在选择集里面)
// 所有的派生类公用一个即可,节省内存
static AcDbObjectIdArray m_arIds;
// 右键点击时的点
AcGePoint3d m_ptPick;
// 菜单ID
UINT_PTR m_idCommand;
/*
m_bUseSingleEntity 说明命令需要操作多个实体,还是单个实体
这个变量决定了发送命令的方式
如果为真,则调用命令时,清空选择集, 把实体以 RTENAME 的方式通过 acedCmd 发送
如果为假,直接将实体放入PICKFIRST,然后直接调用命令,真是命令会读取PICKFIRST来获取实体
默认是true,因为大多命令只需要操作一个实体
*/
bool m_bUseSingleEntity;
// 是否使用
bool m_bUsed;
};
class Filter_Condition: public UIMenuItem
{
public:
typedef bool (*FilterFunc)(const AcDbObjectIdArray &
, const AcGePoint3d &
, LPCTSTR
, const int&);
FilterFunc m_pFunc;
CString m_sFilter; // 将过滤字符串作为成员变量存起来!
int m_N; // 需要实体的数量
public:
Filter_Condition(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &idx
, const UIMenuItem::Category &cat
, FilterFunc func
, LPCTSTR pszFilter
, const int &N )
: UIMenuItem(cmd, name, id, idx, cat)
, m_pFunc(func)
, m_sFilter(pszFilter)
, m_N(N)
{
if (N < 0) // 命令需要多个实体
m_bUseSingleEntity = false;
}
virtual bool eanbleCondition(const AcDbObjectIdArray &ar, const AcGePoint3d &pt)
{
m_ptPick = pt;
if (m_pFunc) return m_pFunc(ar, pt, m_sFilter, m_N);
return false;
}
};
class Filter_Condition_N_ENT: public Filter_Condition
{
public:
Filter_Condition_N_ENT(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &idx
, const UIMenuItem::Category &cat
, FilterFunc func
, LPCTSTR pszFilter
, const int &N
): Filter_Condition(cmd, name, id, idx, cat, func, pszFilter, N) { }
virtual resbuf* executeCommand() const;
};
class Filter_Condition_Sender: public Filter_Condition
{
public:
Filter_Condition_Sender(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &idx
, const UIMenuItem::Category &cat
, FilterFunc func
, LPCTSTR pszFilter
, const int &N
): Filter_Condition(cmd, name, id, idx, cat, func, pszFilter, N) { }
virtual resbuf* executeCommand() const;
};
// 这个类处理接口点插入
// 判断选择的实体是不是从AecMInterfaces派生类,或AecDbXEquipment类
// 且数量是1,并且pt在其接口点附近
// 如果以上条件满足,则弹出菜单
class Fitler_Condition_Interface_Ins: public Filter_Condition
{
public:
Fitler_Condition_Interface_Ins(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &idx
, const UIMenuItem::Category &cat
, LPCTSTR pszFilter )
: Filter_Condition(cmd, name, id, idx, cat, UIMenuItem::isFilterMacth, pszFilter, 1) { }
virtual resbuf* executeCommand() const;
virtual bool eanbleCondition(const AcDbObjectIdArray &ar, const AcGePoint3d &pt);
};
template <bool(func)(const AcDbObjectIdArray &, const AcGePoint3d &)>
class Func_Condition: public UIMenuItem
{
public:
Func_Condition(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &idx
, const UIMenuItem::Category &cat)
: UIMenuItem(cmd, name, id, idx, cat) { }
virtual bool eanbleCondition(const AcDbObjectIdArray &ar, const AcGePoint3d &pt)
{
m_ptPick = pt;
return func(ar, pt);
}
};
template <bool(func)(const AcDbObjectIdArray &, const AcGePoint3d &)>
class Func_Condition_Sender: public Func_Condition<func>
{
public:
Func_Condition_Sender(LPCTSTR cmd
, LPCTSTR name
, const UINT_PTR &id
, const int &idx
, const UIMenuItem::Category &cat)
: Func_Condition<func>(cmd, name, id, idx, cat) { }
virtual resbuf *executeCommand() const
{
acDocManager->sendStringToExecute(acDocManager->curDocument(), this->m_sCommand + _T(" "), false, false, false);
return NULL;
}
};
#define FC_CONDI_SENDER_SIM(cname, mname, weight, category, func)\
class cname: public Func_Condition_Sender<UIMenuItem::func>\
{\
public:\
cname():Func_Condition_Sender<UIMenuItem::func>(L#cname, mname, cmd_start_id++, weight, category) {}\
}
#define FT_CONDI_SENDER_SIM(cname, mname, weight, category, filter, n)\
class cname: public Filter_Condition_Sender\
{\
public:\
cname():Filter_Condition_Sender(L#cname, mname, cmd_start_id++, weight, category, UIMenuItem::isFilterMacth, filter, n) {}\
}
#define FT_CONDI_SIM(cname, mname, weight, category, filter, n)\
class cname: public Filter_Condition\
{\
public:\
cname():Filter_Condition(L#cname, mname, cmd_start_id++, weight, category, UIMenuItem::isFilterMacth, filter, n) {}\
}
#define FT_CONDI_FUL(classname, cmdname, mname, weight, category, filter, n)\
class classname: public Filter_Condition\
{\
public:\
classname():Filter_Condition(L#cmdname, mname, cmd_start_id++, weight, category, UIMenuItem::isFilterMacth, filter, n) {}\
}
#define FT_CONDI_N_ENT(cname, mname, weight, category, filter, n)\
class cname: public Filter_Condition_N_ENT\
{\
public:\
cname():Filter_Condition_N_ENT(L#cname, mname, cmd_start_id++, weight, category, UIMenuItem::isFilterMacth, filter, n) {}\
}
#define FT_COND_INTE_INS(cname, mname, weight, category, filter)\
class cname: public Fitler_Condition_Interface_Ins\
{\
public:\
cname():Fitler_Condition_Interface_Ins(L#cname, mname, cmd_start_id++, weight, category, filter) {}\
}
#define FT_CONDI_FUL_EXE(classname, cmdname, mname, weight, category, filter, n)\
class classname: public Filter_Condition\
{\
public:\
classname():Filter_Condition(L#cmdname, mname, cmd_start_id++, weight, category, UIMenuItem::isFilterMacth, filter, n) {}\
virtual resbuf* executeCommand() const;\
}
#define FC_CONDI_FUL(classname, cmdname, mname, weight, category, func)\
class classname: public Func_Condition<UIMenuItem::func>\
{\
public:\
classname():Func_Condition<UIMenuItem::func>(L#cmdname, mname, cmd_start_id++, weight, category) {}\
}
#define FC_CONDI_SIM(cname, mname, weight, category, func)\
class cname: public Func_Condition<UIMenuItem::func>\
{\
public:\
cname():Func_Condition<UIMenuItem::func>(L#cname, mname, cmd_start_id++, weight, category) {}\
}
#define DEF_UIITEM_FUL_EXE_COD(classname, cmdname, mname, weight, category) \
class classname: public UIMenuItem\
{\
public:\
classname():UIMenuItem(L#cmdname, mname, cmd_start_id++, weight, category) {}\
virtual bool eanbleCondition(const AcDbObjectIdArray &ar, const AcGePoint3d &pt);\
virtual resbuf* executeCommand() const;\
}
#define FC_CONDI_FUL_EXE(classname, cmdname, mname, weight, category, func) \
class classname: public Func_Condition<UIMenuItem::func>\
{\
public:\
classname():Func_Condition<UIMenuItem::func>(L#cmdname, mname, cmd_start_id++, weight, category) {}\
virtual resbuf* executeCommand() const;\
}
FT_CONDI_SIM(CO_COPY, _T("平面复制"), 0, eSys, _T("*"), -1);
FT_CONDI_SIM(CO_MOVE, _T("平面移动"), 1, eSys, _T("*"), -1);
FC_CONDI_SIM(CO_KSXZ, _T("选择同类"), 2, eSys, isOneSHEntity);
FT_CONDI_SIM(CO_KSXG, _T("统一修改"), 3, eSys, _T("AEC*"), -1);
FT_CONDI_SIM(CO_ALIGN, _T("实体对齐"), 3, eSys, _T("AEC*"), -1);
FT_CONDI_SIM(CO_EXPORT, _T("导出Revit"), 3, eExport, _T("AEC*"), -1);
FT_CONDI_SIM(PL_DTYC, _T("全部隐藏"), 0, eOpView, _T("*"), -1);
FT_CONDI_SIM(PL_YCQT, _T("隐藏其它"), 1, eOpView, _T("*"), -1);
FT_CONDI_SIM(PL_TMXS, _T("透明显示"), 2, eOpView, _T("*"), -1);
FT_CONDI_SIM(PL_GYST, _T("工艺视图"), 3, eOpView, _T("AEC_DBWALL,AEC_DBCOLMN"), -2);
FT_CONDI_SIM(PL_JGST, _T("结构视图"), 4, eOpView, _T("AEC_DBWALL,AEC_DBCOLMN"), -2);
FC_CONDI_SIM(PL_DTYG, _T("造型设计"), 0, eDsStut, isOneAndKindOf<AecDbBDPipeBase>);
FC_CONDI_SIM(PL_QMPS, _T("墙面平视"), 1, eDsStut, isOneAndKindOf<AecDbXWall>);
FT_CONDI_SIM(PL_TYQG, _T("墙柱等高"), 2, eDsStut, _T("AEC_DBWALL,AEC_DBCOLMN"), -2);
FT_CONDI_SIM(PL_QTDD, _T("墙体打断"), 3, eDsStut, _T("AEC_DBWALL,AEC_DBEXTENDENT"), 1);
FT_CONDI_SIM(PL_PLGL, _T("批量改梁"), 4, eDsStut, _T("AEC_DBBEAM"), 1);
FT_CONDI_SIM(PL_JXDQ, _T("基线对齐"), 5, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_BXDQ, _T("边线对齐"), 6, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_CBKD, _T("墙体开洞"), 7, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_CDKD, _T("平板开洞"), 8, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_YXKD, _T("异形开洞"), 9, eDsStut, _T("AEC_BDPIPE"), 1);
FT_CONDI_SIM(PL_ZLKD, _T("阵列开洞"), 10, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_YXCG, _T("穿管开洞"), 11, eDsStut, _T("AEC_EWPIPE,AEC_DBCABTRY,AEC_DBDUCT"), 1);
FT_CONDI_SIM(PL_DGKD, _T("多管开洞"), 12, eDsStut, _T("AEC_EWPIPE,AEC_DBDUCT,AEC_DBCABTRY"), -2);
FT_CONDI_SIM(PL_JFZJ, _T("添加方井"), 13, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_JFYJ, _T("加方圆井"), 14, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_JYZJ, _T("添加圆井"), 15, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_JYXJ, _T("加异形井"), 16, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_JJSK, _T("加集水坑"), 17, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_CDST, _T("添加素砼"), 18, eDsStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SENDER_SIM(PL_QTDJ, _T("墙体倒角"), 19, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_QTDY, _T("墙体倒圆"), 21, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_JBWC, _T("加保温层"), 22, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_FFTM, _T("防腐涂面"), 23, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_WQTP, _T("外墙贴皮"), 24, eDsStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_CRJZ, _T("插入角柱"), 0, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_DXCH, _T("带型窗户"), 1, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_ZJCH, _T("转角窗户"), 2, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_JLHC, _T("加老虎窗"), 3, eCrStut, _T("AEC_DBXROOF"), 1);
FT_CONDI_SENDER_SIM(PL_FZYT, _T("放置阳台"), 4, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SENDER_SIM(PL_FZTJ, _T("放置台阶"), 5, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_DXBQ, _T("单线变墙"), 6, eCrStut, _T("LINE,LWPOLYLINE,ARC,CIRCLE"), 1);
FT_CONDI_SIM(PL_GZZZ, _T("构造柱子"), 7, eCrStut, _T("LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_ZZDZ, _T("柱子底座"), 8, eCrStut, _T("AEC_DBCOLMN"), 1);
FC_CONDI_SIM(PL_HZDB, _T("底 板"), 9, eCrStut, isSlab);
FC_CONDI_SIM(PL_FZPB, _T("楼 板"), 10, eCrStut, isSlab);
FC_CONDI_SIM(PL_HZGB, _T("盖 板"), 11, eCrStut, isSlab);
FC_CONDI_SIM(PL_HZXB, _T("斜 底 板"), 12, eCrStut, isXSlab);
FT_CONDI_SIM(PL_DLJC, _T("板 基 础"), 13, eCrStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_QXHN, _T("曲线护栏"), 14, eCrStut, _T("LWPOLYLINE,ARC,CIRCLE,LINE"), 1);
FC_CONDI_SIM(PL_RYPD, _T("任意屋顶"), 15, eCrStut, isClosedPLine);
FC_CONDI_SIM(PL_RZPD, _T("人字屋顶"), 16, eCrStut, isClosedPLine);
FT_CONDI_SIM(PL_YHLT, _T("圆弧楼梯"), 17, eCrStut, _T("ARC"), 1);
FT_CONDI_SIM(PL_QTCC, _T("墙体插窗"), 18, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_QTCM, _T("墙体插门"), 19, eCrStut, _T("AEC_DBWALL"), 1);
FT_CONDI_SIM(PL_ZHMC, _T("组合门窗"), 20, eCrStut, _T("AEC_DBOPENING"), -2);
FT_CONDI_SIM(PL_BZZJ, _T("布置桩基"), 21, eCrStut, _T("AEC_DBSLAB"), 1);
FT_CONDI_SIM(PL_CJSY, _T("进出水堰"), 22, eCrStut, _T("LWPOLYLINE,LINE,ARC,CIRCLE"), 1);
FT_CONDI_SIM(PL_PMFY, _T("平面放样"), 23, eCrStut, _T("LINE"), 1);
FT_CONDI_SIM(PL_LJGD, _T("路径管线"), 0, eCrPipe, _T("LINE,AEC_ROADAXISLINE,LWPOLYLINE,POLYLINE"), 1);
FT_CONDI_SIM(PL_FYGX, _T("放样管线"), 1, eCrPipe, _T("LWPOLYLINE,ARC,CIRCLE"), 1);
FC_CONDI_SIM(PL_FZFM, _T("复制阀门"), 2, eCrPipe, isOneValve);
FC_CONDI_SIM(PL_LGGJ, _T("立管固架"), 3, eCrPipe, isVertPipe);
FT_CONDI_N_ENT(PL_WTLG1, _T("弯头连管"), 0, eDsPipe, _T("AEC_EWPIPE"), 2);
FT_CONDI_N_ENT(PL_wmerge, _T("合并管线"), 1, eDsPipe, _T("AEC_EWPIPE"), 2);
FT_CONDI_SIM(PL_GXLJ, _T("管线连接"), 2, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_TJST1, _T("三通连接"), 3, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_TJST2, _T("添加四通"), 4, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_GXGM, _T("管线共面"), 5, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_ZGBQ, _T("支管补强"), 6, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_GJBG, _T("管线变更"), 7, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_UXBR, _T("U型避让"), 8, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_XGXG, _T("修改斜管"), 9, eDsPipe, _T("AEC_EWPIPE"), 1);
FT_CONDI_FUL(PL_SBXZ1, PL_SBXZ, _T("阀件旋转"), 10, eDsPipe, _T("AEC_DBEWFIT"), 1);
FC_CONDI_FUL(PL_SBXZ2, PL_SBXZ, _T("阀门旋转"), 11, eDsPipe, isOneValve);
FT_COND_INTE_INS(PL_DJWT, _T("端加弯头"), 0, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_45WT, _T("45度弯头"), 2, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_BJWT, _T("变径弯头"), 3, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_GXBJ, _T("管线变径"), 4, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_DJST, _T("端加三通"), 5, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_PXST, _T("偏向三通"), 6, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_DZST, _T("定制三通"), 7, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_EFST, _T("二分三通"), 8, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_TJDT, _T("添加堵头"), 9, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_CRFL, _T("单插法兰"), 10, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_CDFL, _T("插双法兰"), 11, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_TJKG, _T("添加卡箍"), 12, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_CRMB, _T("插入盲板"), 13, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FC_CONDI_SIM(PL_BZMB, _T("八字盲板"), 14, eInsFitting, isFlange);
FC_CONDI_SIM(PL_FZCB, _T("放置插板"), 15, eInsFitting, isFlange);
FT_COND_INTE_INS(PL_TJZT, _T("插入直通"), 16, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_TJHJ, _T("插入活接"), 17, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_JSJT, _T("加伸缩节"), 18, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_WLJT, _T("外螺纹接"), 19, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FT_COND_INTE_INS(PL_NLJT, _T("内螺纹接"), 20, eInsFitting, _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBXEQUIPMENT,AEC_DBWEQUIPMENT"));
FC_CONDI_SIM(PL_CXBG, _T("插斜板管"), 0, eCrEqui, isClosedPLine);
FT_CONDI_SIM(PL_CRBQ, _T("插曝气器"), 1, eCrEqui, _T("AEC_EWPIPE"), -1);
FC_CONDI_SIM(PL_SBLG, _T("设备连管"), 0, eDsEqui, isEquButNoValve);
FC_CONDI_SIM(PL_SBDJ, _T("设备对接"), 1, eDsEqui, isEquButNoValve);
FC_CONDI_FUL(PL_SBJC1, PL_SBJC, _T("设备基础"), 2, eDsEqui, isEquButNoValve);
FT_CONDI_FUL(PL_SBJC2, PL_SBJC, _T("设备基础"), 3, eDsEqui, _T("AEC_DBPARAEQUI,AEC_DBXEQUIPMENT"), 1);
FC_CONDI_FUL(PL_XGBG1, PL_XGBG, _T("修改标高"), 4, eDsEqui, isEquButNoValve);
FT_CONDI_FUL(PL_XGBG2, PL_XGBG, _T("修改标高"), 5, eDsEqui, _T("AEC_DBXBG,AEC_DBTERRAIN,AEC_RIVERGROOVE,AEC_DBWEIR,AEC_DBEXTENDENT,AEC_DBPARAEQUI,AEC_DBXEQUIPMENT"), 1);
FC_CONDI_SENDER_SIM(PL_SBGZ, _T("设备管嘴"), 6, eDsEqui, isEquButNoValve);
FC_CONDI_FUL(CO_SFXT1, CO_SFXT, _T("指定系统"), 7, eDsEqui, isEquButNoValve);
FT_CONDI_FUL(CO_SFXT2, CO_SFXT, _T("指定系统"), 8, eDsEqui, _T("AEC_DBXEQUIPMENT"), 1);
FT_CONDI_SENDER_SIM(P3_CRZF, _T("闸 阀"), 0, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRDXZF, _T("刀型闸阀"), 1, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRJZF, _T("截 止 阀"), 2, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRQF, _T("球 阀"), 3, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRZHF, _T("止 回 阀"), 4, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRDF, _T("碟 阀"), 5, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRPQF, _T("排 气 阀"), 6, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRZSF, _T("柱 塞 阀"), 7, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRFQF, _T("浮 球 阀"), 8, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRTJF, _T("调 节 阀"), 9, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRSLKZF, _T("水力控制阀"), 10, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRJYF, _T("浆 液 阀"), 11, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRPNF, _T("排 泥 阀"), 12, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRDCF, _T("电 磁 阀"), 13, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_GDBC, _T("补 偿 器"), 14, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRSSJT, _T("伸缩接头"), 15, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRCLJT, _T("传力接头"), 16, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CLBK, _T("插喇叭口"), 17, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(P3_CRXJJT, _T("橡胶接头"), 18, eInsParamValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CRZF, _T("闸 阀"), 0, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CJZF, _T("截 止 阀"), 1, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_AQFM, _T("球 阀"), 2, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CZHF, _T("止 回 阀"), 3, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CRDF, _T("碟 阀"), 4, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CRJF, _T("角 阀"), 5, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CAQF, _T("安 全 阀"), 6, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_STFM, _T("三 通 阀"), 7, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_XTFM, _T("四 通 阀"), 8, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_TJFM, _T("调 节 阀"), 9, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_SSFM, _T("疏 水 阀"), 10, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_XSFM, _T("旋 塞 阀"), 11, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_GMFM, _T("隔 膜 阀"), 12, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_JYFM, _T("减 压 阀"), 13, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CBYF, _T("背 压 阀"), 14, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CZXF, _T("针 型 阀"), 15, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CCBF, _T("常 闭 阀"), 16, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CPQF, _T("排 气 阀"), 17, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CJYF, _T("浆 液 阀"), 18, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CPNF, _T("排 泥 阀"), 19, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CDCF, _T("电 磁 阀"), 20, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_SSJT, _T("伸缩接头"), 21, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_CLJT, _T("传力接头"), 22, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SENDER_SIM(PL_XJJT, _T("橡胶接头"), 23, eInsCustomValve, _T("AEC_EWPIPE"), 1);
FT_CONDI_SIM(PL_PFBZ, _T("梁柱标注"), 0, eDimStut, _T("AEC_DBCOLMN,AEC_DBBEAM,LINE"), 1);
FT_CONDI_SIM(PL_DKBH, _T("洞口编号"), 1, eDimStut, _T("AEC_X3DPART"), 1);
FT_CONDI_SIM(PL_DHFW, _T("洞号复位"), 2, eDimStut, _T("AEC_X3DPART"), 1);
FT_CONDI_SIM(PL_BHYX, _T("编号隐显"), 3, eDimStut, _T("AEC*"), -1);
FT_CONDI_SIM(PL_DKBZ, _T("洞口标注"), 4, eDimStut, _T("AEC_X3DPART,LINE,POINT,CIRCLE"), 1);
FT_CONDI_SIM(PL_TGBZ, _T("套管标注"), 5, eDimStut, _T("AEC_X3DPART,LINE,POINT"), 1);
FT_CONDI_SIM(PL_YHBZ, _T("翼环标注"), 6, eDimStut, _T("AEC_X3DPART,LINE"), 1);
FT_CONDI_SIM(PL_MCMM, _T("门窗命名"), 7, eDimStut, _T("AEC_DBOPENING"), 1);
FT_CONDI_SIM(PL_ZXBZ, _T("在线标注"), 0, eDimSys, _T("AEC_EWPIPE,LINE,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_XSBZ, _T("线上标注"), 1, eDimSys, _T("AEC_EWPIPE,LINE,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_XXBZ, _T("线下标注"), 2, eDimSys, _T("AEC_EWPIPE,LINE,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_YCBZ, _T("引出标注"), 3, eDimSys, _T("AEC_EWPIPE,AEC_DBEWFIT,LINE,ARC,CIRCLE,INSERT,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_YCSB, _T("引出上标"), 4, eDimSys, _T("AEC_EWPIPE,AEC_DBEWFIT,LINE,ARC,CIRCLE,INSERT,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_ZZBZ, _T("垂直标注"), 5, eDimSys, _T("AEC_EWPIPE,AEC_DBEWFIT,LINE,ARC,CIRCLE,INSERT,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_ZZCB, _T("垂直侧标"), 6, eDimSys, _T("AEC_EWPIPE,AEC_DBEWFIT,LINE,ARC,CIRCLE,INSERT,LWPOLYLINE"), 1);
FT_CONDI_SIM(PL_GJBZ, _T("管件标注"), 7, eDimSys, _T("AEC_EWPIPE,AEC_DBEWFIT,LINE,ARC,CIRCLE,INSERT,LWPOLYLINE"), 1);
FC_CONDI_FUL(PL_FMBZ1, PL_FMBZ, _T("阀门标注"), 8, eDimSys, isOneValve);
FT_CONDI_FUL(PL_FMBZ2, PL_FMBZ, _T("阀门、设备、仪表标注"), 9, eDimSys, _T("POINT,LINE,INSERT"), 1);
FC_CONDI_SIM(PL_SBBZ, _T("设备、仪表标注"), 10, eDimSys, isEquButNoValve);
FT_CONDI_SIM(HA_FBBZ, _T("风管标注"), 11, eDimSys, _T("AEC_DBDUCT"), 1);
FT_CONDI_SIM(EL_QJBZ1, _T("桥架标1"), 12, eDimSys, _T("AEC_DBCABTRY,AEC_DBECFIT,LINE"), 1);
FT_CONDI_SENDER_SIM(EL_QJBZ2, _T("桥架标2"), 13, eDimSys, _T("AEC_DBCABTRY,LINE"), 1);
FT_CONDI_SIM(EL_DLBZ, _T("电缆标注"), 14, eDimSys, _T("AEC_EWCABLE"), 1);
#pragma endregion
class AecObjectUIContext: public AcEdUIContext
{
public:
typedef std::set<UIMenuItem *, UIMenuItem::compareItemsById> UIItemSet;
typedef std::set<UIMenuItem::Category> Categories;
typedef std::vector<UIMenuItem *> UIItemVector;
public:
AecObjectUIContext();
virtual ~AecObjectUIContext();
virtual void *getMenuContext(const AcRxClass *pClass, const AcDbObjectIdArray &ids);
virtual void onCommand(Adesk::UInt32 cmdIndex);
void buildMenu(const AcDbObjectIdArray &ids, const AcGePoint3d &ptPick);
UIMenuItem* findItemById(const UINT_PTR &id);
void items2Json(LPCTSTR pszPath) const;
void initMenuItems();
void remakeMenuItems();
static void AddContext(void *pAppID);
static void DelContext();
static void output2Json();
static const CString outputFileName;
static AecObjectUIContext *g_pBaseUIContext;
private:
void analyCfgFile();
private:
HMENU m_hMenu;
// 所有菜单项的集合,没有顺序
UIItemVector m_menuItems;
// 按菜单ID顺序
UIItemSet m_UIItemSet;
// 菜单分类顺序
std::vector<UIMenuItem::Category> m_sortCategories;
};
class AecDefaultUIContext: public AcEdUIContext
{
public:
AecDefaultUIContext();
virtual ~AecDefaultUIContext();
virtual void *getMenuContext(const AcRxClass *pClass, const AcDbObjectIdArray &ids);
virtual void onCommand(Adesk::UInt32 cmdIndex);
static void AddContext(void *pAppID); // 需要 AppID
static void DelContext();
private:
static AecDefaultUIContext *g_pDefaultContext;
HMENU m_hMenu; // 纯 Win32 句柄
};
namespace AecUIContext
{
void AddContext(void *pAppID);
void DelContext();
}