cad---菜单,工具栏,屏幕菜单,增强工具栏

cad之辅助提示功能

最近有个小老弟自己在网上找了一大堆插件,然后他想做一个类似菜单什么的去使用这些零碎的插件,想自定义一个工具集,然后就问我菜单,工具栏,屏幕菜单等等的做法,这里做一个总结,相关资料信息在XD论坛,明经通道都有。。。
常见的cad辅助提示,包括菜单,工具栏,难度大的包括屏幕菜单,增强工具栏等等

菜单

cad的菜单比较常见,比如
在这里插入图片描述
一般来说,给别人做插件的时候,如果做的是一个模块的插件,比如这种对支架的模块
cad---菜单,工具栏,屏幕菜单,增强工具栏_第1张图片
那么菜单就是比较合适的了。
制作菜单的办法有很多,比如使用MFC创建,使用COM创建,使用CUI文件等,在这里,我最推荐的方法是使用CUI,快捷,方便,几乎不会出错。这里,给个例子:首先创建mnu格式的文件,写入如下:

***MENUGROUP=SIMPLE_GROUP

***POP1
**FILE
ID_MENU_FILE              [场地平面图文件(&F)]^C^C_open
ID_FILE_LOCATION          [存储平面位置(&L)]^C^CPMWZ
ID_FILE_LAYOUT            [存储场地布置(&A)]^C^CCDBZ
ID_FILE_PLAN              [存储计划(&P)]^C^CCCJH
[--]
ID_FILE_EXIT              [退出(&E)]^C^C_quit
[--]


***HELPSTRINGS
ID_MENU_FILE              [打开场地平面图文件]
ID_FILE_LOCATION          [存储场地平面位置到磁盘文件中]
ID_FILE_LAYOUT            [存储场地布置到二进制文件中]
ID_FILE_PLAN              [存储施工计划到磁盘文件中]
ID_FILE_EXIT              [退出ACAD]

然后,打开cad,使用命令menuload,加载这个mnu文件,cad加载后,会生成同名的mnr和cuix文件
cad---菜单,工具栏,屏幕菜单,增强工具栏_第2张图片
cad---菜单,工具栏,屏幕菜单,增强工具栏_第3张图片
我一般懒得进行进一步的优化菜单,让它更加美观,如果有人愿意这么做的话,可以使用cui编辑器,去给这个cuix菜单文件添加图标啊什么的,更加好看。
把cuix文件和arx文件放在一起,最后在代码中加载这个cuix文件即可。
最后做一下总结:使用cuix文件生成菜单的方法最方便,快捷,不需要你修改代码,在添加icon的过程中更加方便,简单。对于com和mfc方法去添加菜单的,有两点不好,一是修改菜单就要修改代码,二是,切换cad的工作空间,菜单会消失,这个比较麻烦。

工具栏

工具栏
实话,工具栏也是我比较推荐的方法,如果你做的插件也是专属于一个模块,但是,命令却比较少,比如也就10个以内,那么工具栏就是很好的方法了,工具栏的做法也有多种,com,MFC,cuix都可以做,这里同样优先推荐使用cuix的方法,方便,简单,如果不会操作的,打开cad,按下F1,帮助文档里面都有如何创建工具栏菜单等
cad---菜单,工具栏,屏幕菜单,增强工具栏_第4张图片
我在这里说的是增强型工具栏,比如插件老虎板王,msteel的工具栏
cad---菜单,工具栏,屏幕菜单,增强工具栏_第5张图片
使用增强型工具栏,主要是对于大型的,多模块的命令,做一个界面化的操作,适合于中等偏大型的做法,我也做了一个类似的东西
cad---菜单,工具栏,屏幕菜单,增强工具栏_第6张图片
它的布局和里面的菜单最好是有一个文件控制,比如需要多少个按钮,按钮里面有多少个菜单等,在一个文件内写清楚后,解析这个文件,生产这个工具栏。

[按钮]
结构建模
画墙工具
墙柱绘制
楼板工具
基础设计
钢筋绘制
文字工具
图层工具
其他工具

[MENU=结构建模]
0-梁线建模-MODEL_LXJM
0-梁模转图-MODEL_LMZT
0-墙线建模-MODEL_QXJM
0-墙模转图-MODEL_QMZT

[MENU=画墙工具]
0-轴线画梁-BEAM_ZXHL
0-画直线梁-BEAM_HZXL
0-梁中生线-BEAM_LZSX
0-梁梁交线-BEAM_LLJX
0-梁柱交线-BEAM_LZJX
0-虚实变换-BEAM_XSBH
0-粗线变梁-BEAM_CXBL
0-连接梁线-BEAM_LJLX
0-梁折断线-BEAM_LZDX
1
0-线比系数-BEAM_XBXS
0-梁集标注-BEAM_LJZB
0-编号查询-BEAM_BHCX
0-梁重编号-BEAM_LCBH

[MENU=墙柱绘制]
0-插方形柱-COLU_CFZ
0-插圆形柱-COLU_CYZ
0-柱子填充-COLU_ZTC
0-柱子空心-COLU_ZKX
0-柱虚实-COLU_ZXS
0-柱放大-COLU_ZFD
1
0-粗线变墙-WALL_CXBQ
0-墙填充-WALL_QTC
0-墙空心-WALL_QKX
0-墙虚实-WALL_QXS
0-墙端封口-WALL_QFK
0-墙上开洞-WALL_QKD
0-墙线折断-WALL_QXZD
1
0-墙柱形心-WC_QZXX
0-墙柱工具-WC_QZGJ

[MENU=楼板工具]
0-板开洞口-FLOOR_DK
0-板填充一-FLOOR_BTCA
0-板填充二-FLOOR_BTCB
0-板填充三-FLOOR_BTCC
0-添加板厚-FLOOR_TJBH

[MENU=基础设计]
0-桩数统计-BASE_ZSTJ
0-画桩程序-BASE_HZCX

[MENU=钢筋绘制]
0-绘制点筋-REIN_HZDJ
0-空实变换-REIN_KSBH
1
0-绘制拉筋-REIN_HZLJ
0-S形拉筋-REIN_SLJ
0-绘制箍筋-REIN_GJ
0-连续钢筋-REIN_LXGH
0-线变钢筋-REIN_XBGJ
0-绘组钢筋-REIN_HZGJ
1
0-附加吊筋-REIN_FJDJ
0-附加箍筋-REIN_FJGJ
0-任意负筋-REIN_RYFJ
0-任意正筋-REIN_RYZJ
0-板钩变换-REIN_BGBH
0-范围选数-REIN_FWXS

[MENU=文字工具]
0-文字查找-TEXT_WZCZ
0-统一字高-TEXT_TYZG
0-文字边框-TEXT_WZBK
0-文本偏移-TEXT_WBPY
0-文字连接-TEXT_WZLJ
1
0-文字对齐-TEXT_WZDQ
0-修改对齐-TEXT_XGDQ
0-文字平行-TEXT_WZPX
0-转MTEXT-TEXT_ZMTEXT
0-调行间距-TEXT_THJJ
0-查字重叠-TEXT_CZCD
1
0-加前后缀-TEXT_JQHZ
0-文字互换-TEXT_WZHH
0-文字刷-TEXT_WSZ
0-求平均数-TEXT_QPJS
0-快速改字-TEXT_KSGZ

[MENU=图层工具]
0-图层设置-_layer
0-转当前层-_laycur
0-置为当前-_laymcur
0-选层显示-LAYER_XCXS
0-选层关闭-_layoff
0-图层全开-_layon
0-锁定图层-_laylck
0-解锁图层-_layulk
0-图层删除-LAYER_TUSC
0-参照开关-LAYER_CZKG
0-图层前置-LAYER_TCQZ
0-图层后置-LAYER_TCHZ
0-填充后置-LAYER_TCHZ
0-按色显示-LAYER_ASXS
1
0-隐藏对象-LAYER_YCDX
0-显示对象-LAYER_XSDX

[MENU=其他工具]
0-结构审图-OTHER_YXST
0-引线文字-OTHER_YXWZ
0-绘制箭头-OTHER_HZJT
0-改线宽度-OTHER_GXKD
0-选择易-OTHER_XZY
0-随心拉移-GG
0-线弧转PL-OTHER_XHZPL
0-多线加点-OTHER_DXJD
0-多线去点-OTHER_DXQD
0-存为今天-OTHER_CWJT

这个是我写的一个文件,它里面包括了按钮,和每个按钮下的菜单。
假如菜单内含有子菜单

[MENU=其他工具]
0-结构审图-OTHER_YXST
0-引线文字-OTHER_YXWZ
0-绘制箭头-OTHER_HZJT
0-改线宽度-OTHER_GXKD
0-选择易-OTHER_XZY
2-其他设置
0-线弧转PL-OTHER_XHZPL
0-多线加点-OTHER_DXJD
0-多线去点-OTHER_DXQD
0-存为今天-OTHER_CWJT

[SUBMENU=其他设置]
0-线弧转PL-OTHER_XHZPL
0-多线加点-OTHER_DXJD

这样子添加即可,方便实用,不需要修改代码,解析文件就好
这个增强型工具栏的思路:

#pragma once

#include "resource.h"
#include "SendCmd.h"
#include "ToolButton.h"


#define BAR_FIRST_MENU_ID 3000
#define BAR_FIRST_BUTTON_ID 4000

struct MenuItemTag
{
public:
    MenuItemTag(UINT flags, UINT ids, CString name, CString cmd) : menuName(name),menuCmd(cmd)
    {
        nFlags = flags;
        nIds = ids;
    }
    MenuItemTag(const MenuItemTag& other)
    {
        nFlags = other.nFlags;
        nIds = other.nIds;
        menuName = other.menuName;
        menuCmd = other.menuCmd;
    }

    MenuItemTag& operator = (const MenuItemTag &other)
    {
        if (this != &other)
        {
            nFlags = other.nFlags;
            nIds = other.nIds;
            menuName = other.menuName;
            menuCmd = other.menuCmd;
        }
        return *this;
    }
public:
    UINT nFlags;//MF_STRING, MF_SEPARATOR,MF_SUBPOP
    UINT nIds;
    CString menuName;
    CString menuCmd;
};

typedef std::vector<MenuItemTag> MenuGroup;
typedef std::map<CString, MenuGroup> MenuMap;
typedef std::map<UINT, CString> MenuCmdMap;

class CBarDlg : public CAcUiDialogBar
{
    DECLARE_DYNAMIC(CBarDlg)

public:
    CBarDlg(CWnd* pParent = NULL);   // 标准构造函数
    virtual ~CBarDlg();
    // 对话框数据
    enum { IDD = IDD_DIALOG_MENUBAR }; 

    //一系列button
    std::vector<CToolButton*> m_buttons;

    MenuMap m_map;
    MenuCmdMap m_cmdMap;
    void InitMenuMap();
    //弹出菜单
    CMenu m_popMenu;
    void PopupMenu(CString titleName, UINT nCtrlId);
    void CreateSubPopupMenu(CMenu &popMenu, CString titleName);
    CPoint GetTrackPnt(UINT nCtlrId);
    void OnToolButtonClick(UINT buttonId);
    void OnPopupMenuItemClick(UINT menuId);
    std::vector<CString> GetMenu(CString menuPath);
    void CreateButton(std::vector<CString>& button);
    void CreateMenu(std::vector<CString>& button);
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
    DECLARE_MESSAGE_MAP()
protected:
    afx_msg void OnPaint();
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg LRESULT OnInitDialog(WPARAM, LPARAM);
};

//-----------------------------------------------------------------------------
//----- ToolButton.h : Declaration of the CToolButton
//-----------------------------------------------------------------------------
#pragma once

//-----------------------------------------------------------------------------
#include "acui.h"

//-----------------------------------------------------------------------------
class CToolButton : public CAcUiToolButton
{
	DECLARE_DYNAMIC (CToolButton)
    CString m_strCaption;//名称
    CFont *m_pFont;
public:
	CToolButton();
	virtual ~CToolButton();
    BOOL Create(LPCTSTR str, DWORD dyStyle, const RECT& rect, CWnd *parent, UINT nID);
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
	DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};

一个CAcUiDialogBar的派生,一个CAcUiToolButton的派生,就搞定了,比较简单

屏幕菜单

按照道理来讲,屏幕菜单估计是最麻烦的体系了,商业化的大型插件工具才会用到这个,比如天正和探索者,一般来说都是大型商业化的东西才会用到这个,自定义程度最高。屏幕菜单里面可以添加很多东西,比如图标按钮,抽屉型菜单,各种带有ICON的按钮等等,反正做的比较好看,但是这个就需要MFC功底了,并且需要大型维护,成本比较高。这是我自己做的屏幕菜单
cad---菜单,工具栏,屏幕菜单,增强工具栏_第7张图片
这个东西,我在明经通道上看到的类似的,然后拿过来重写的。复杂点,但是也是和增强型工具栏一样,写一个mnu或者txt描述所有的菜单,然后以后修改文件即可修改屏幕菜单,一劳永逸。

总结

方法 优点 缺点
工具栏 适合少量命令 不适合大型模块,多模块
菜单 适合中小型模块, 多模块 不适合大型模块,使用com和MFC方式有缺点
增强工具栏 适合大中型体系模块 需要维护代码,成本高
屏幕菜单 适合商业化插件 成本高

强烈推荐,尽量使用工具栏和菜单栏,成本低,不会编程的人也能按照帮助文档去建立自己的一套插件模块。并且一套cui文件,几乎所有cad都会识别,不像编程那种,还要编译多个版本,麻烦!最后,小老弟采用了工具栏+菜单栏的办法,一套cui全搞定,而且,本来cad的绘图区域就不大,菜单和工具栏占据的空间是最小的,也是最容易调整的

你可能感兴趣的:(AutoCad,ObjectARX编程,工具栏,菜单,屏幕菜单,增强工具栏)