#pragma once #include #include #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 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 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 static bool isKindOf(CONDI_PARAMS) { for (int i(0); i < ar.length(); ++i) { if (isKindOf(ar[i]) == false) return false; } return true; } // 实体数量必须大于1 template static bool isMoreKindOf(CONDI_PARAMS) { if (ar.length() < 2) return false; for (int i(0); i < ar.length(); ++i) { if (isKindOf(ar[i]) == false) return false; } return true; } template static bool isOneAndKindOf(CONDI_PARAMS) { return (ar.length() == 1 && isKindOf(ar.first())); } template static bool isOneAndKindOf(CONDI_PARAMS) { return ar.length() == 1 && (isKindOf(ar.first()) || isKindOf(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 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 class Func_Condition_Sender: public Func_Condition { public: Func_Condition_Sender(LPCTSTR cmd , LPCTSTR name , const UINT_PTR &id , const int &idx , const UIMenuItem::Category &cat) : Func_Condition(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\ {\ public:\ cname():Func_Condition_Sender(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\ {\ public:\ classname():Func_Condition(L#cmdname, mname, cmd_start_id++, weight, category) {}\ } #define FC_CONDI_SIM(cname, mname, weight, category, func)\ class cname: public Func_Condition\ {\ public:\ cname():Func_Condition(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\ {\ public:\ classname():Func_Condition(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); FC_CONDI_SIM(PL_QMPS, _T("墙面平视"), 1, eDsStut, isOneAndKindOf); 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 UIItemSet; typedef std::set Categories; typedef std::vector 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 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(); }