cad之辅助提示功能

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

菜单

cad的菜单比较常见,比如

一般来说,给别人做插件的时候,如果做的是一个模块的插件,比如这种对支架的模块

那么菜单就是比较合适的了。
制作菜单的办法有很多,比如使用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文件


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

工具栏


实话,工具栏也是我比较推荐的方法,如果你做的插件也是专属于一个模块,但是,命令却比较少,比如也就10个以内,那么工具栏就是很好的方法了,工具栏的做法也有多种,com,MFC,cuix都可以做,这里同样优先推荐使用cuix的方法,方便,简单,如果不会操作的,打开cad,按下F1,帮助文档里面都有如何创建工具栏菜单等

我在这里说的是增强型工具栏,比如插件老虎板王,msteel的工具栏

使用增强型工具栏,主要是对于大型的,多模块的命令,做一个界面化的操作,适合于中等偏大型的做法,我也做了一个类似的东西

它的布局和里面的菜单最好是有一个文件控制,比如需要多少个按钮,按钮里面有多少个菜单等,在一个文件内写清楚后,解析这个文件,生产这个工具栏。

[按钮]
结构建模
画墙工具
墙柱绘制
楼板工具
基础设计
钢筋绘制
文字工具
图层工具
其他工具[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 4000struct 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_SUBPOPUINT 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 }; //一系列buttonstd::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功底了,并且需要大型维护,成本比较高。这是我自己做的屏幕菜单

这个东西,我在明经通道上看到的类似的,然后拿过来重写的。复杂点,但是也是和增强型工具栏一样,写一个mnu或者txt描述所有的菜单,然后以后修改文件即可修改屏幕菜单,一劳永逸。

总结

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

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

cad---菜单,工具栏,屏幕菜单,增强工具栏相关推荐

  1. 迅捷CAD编辑器应该怎么调出工具栏

    在CAD编辑器中,编辑工具栏有很多种,一般都是在CAD界面中的,有时候界面不见了就要把它调出来.还有很多的朋友是不知道要怎么把编辑工具栏调出来的.下面是我帮大家整理的编辑工具栏调用的办法,希望能够帮助 ...

  2. CAD将未显示在工具栏中的功能添加到工具栏中——以QLEADER为例

    问题描述 CAD将未显示在工具栏中的功能添加到工具栏中--以QLEADER为例 问题解决 这时我们可以选择视图→工具栏. 在下拉框中选择标注 将其拖动至标注工具栏 最后点击确定即可.

  3. 计算机菜单右侧桌面,桌面工具栏怎么还原?工具栏在右边怎么办

    新手们在使用电脑的过程中总有这样那样的问题出现,尽管是很简单的问题,但是对于新手来说,一时也想不到对策,桌面工具栏怎么还原的问题则是其中一个再简单不过的问题了.工具栏在右边怎么办.工具栏怎么还原,这一 ...

  4. ATL 实现定制的 IE 浏览器栏、工具栏和桌面工具栏

    下载源代码 关键字:Band,Desk Band,Explorer Band,Tool Band,浏览器栏,工具栏,桌面工具栏 一.引言 最近,由于工作的要求,我需要在 IE 上做一些开发工作.于是在 ...

  5. 火狐浏览器书签工具栏图标_将您的书签工具栏缩小为工具栏按钮

    火狐浏览器书签工具栏图标 So you have reduced your UI in Firefox to regain more screen real-estate but have a lot ...

  6. 加载cad菜单(.mns .mnu .cuix文件)

    加载菜单 bool PhdUtility::LoadCadMenu(const CString& strMenuFileName, const CString& strMenuGrou ...

  7. python从excel读彩票数据统计分析,用matplotlib.pyplot做可视图在程序窗口显示,并可动态切换Canvas的可视图,窗口里还添加了菜单和Button按钮工具栏,按钮换图

    # -*- coding: utf-8 -*- """ Created on Tue May 14 18:58:50 2019 把图片保存成了文件,供gui窗口读取,取消 ...

  8. Winform控件之菜单控件,工具栏控件和状态栏控件

    菜单是用户获取应用程序中主要功能和实用程序的主要途径,如新建文件,打开文件等,这就需要用到菜单控件(MenuStrip).工具栏另一种获取应用程序主要功能的常用方法,比起菜单要直观,这就需要用到工具栏 ...

  9. MFC CMFCToolBar静态工具栏和动态工具栏,加载自定义图片(真彩透明)

    现在把我最新研究的对CMFCToolBar心得写在这边. 现在介绍两种加载工具栏的方式: 一种是静态加载工具栏,跟普通的加载工具栏一样,只是用了自定义图片. 一种是动态加载工具栏,这个也是需要静态工具 ...

  10. MFC实现256色工具栏图标及工具栏提示信息

    MFC中,ToolBar上的button绘制图标,默认只支持16色,如果从Icon资源将超过16色的bmp拷贝到ToolBar的button上会出现颜色失真,网上有使用CImageList实现256色 ...

最新文章

  1. WorkFlow设计篇Step.2—传参的用法-订单金额的处理(续)-WF4.0
  2. oracle往mysql数据同步存储过程_Oracle数据库之间数据同步
  3. firefox如何载入json文件_如何去解决JS跨域问题 怎么能学好Web前端开发
  4. MyBatis Generator分页插件RowBoundsPlugin坑
  5. HA机制的大数据集群的搭建过程
  6. SQL Server 将某一列的值拼接成字符串
  7. [vb]SendMessageA函数
  8. 基于Linux平台Softimage XSI 演示
  9. Mac下的Homebrew安装与使用
  10. viper4android 机顶盒,利用VIPer53封装上系统实现经济型机顶盒供电
  11. simulink电机仿真学习 - park变换,输入交流输出仍然是交流问题解决
  12. 5G无线技术基础自学系列 | 大规模天线阵列
  13. Vivado IP核之定点数转为浮点数Floating-point
  14. 防火墙开放21端口linux,linux防火墙开放80,3306,21,443端口
  15. R语言必看推荐:R语言入门经典版(中文版)+R语言实战第二版(中文完整版)
  16. 鸥玛软件在深交所创业板挂牌上市,系山东大学间接控股企业
  17. GUID分区与MBR分区有什么区别? 操作系统知识
  18. 【愚公系列】2021年12月 网络工程-进制转换
  19. 各种后门攻击以及防御复现
  20. 智慧水利行业综合管理平台

热门文章

  1. 计算机一级考试wps教程视频教程,全国计算机等级考试一级WPS Office教程(2008年版)...
  2. timesten java_使用java调用timesten实现Oracle入库
  3. python 手机号码归属地 软件_Python实现的手机号归属地相关信息查询功能示例
  4. Protel使用的60个问题和解答
  5. 什么是机器学习(Machine Learning)? |李宏毅机器学习【1】
  6. 【渗透测试】利用永恒之蓝漏洞实现桌面监控
  7. arduino学习笔记-库函数解析_LiquidCrystal_i2c使用说明以及lcd1602的驱动
  8. HSqlDB认识及使用
  9. hsqldb的存储方式
  10. java计算机毕业设计网络游戏后台管理系统MyBatis+系统+LW文档+源码+调试部署