iCAx开思网
标题:
AutoCAD菜单的开发技术
[打印本页]
作者:
sun874
时间:
2005-5-5 14:04
标题:
AutoCAD菜单的开发技术
AutoCAD菜单的开发技术
出处:PConline
AutoCAD作为一款强大的工程绘图软件,已经成为工程人员工作中不可缺少的重要工具。AutoCAD的主要命令方式是命令行,几乎所有的操作都可以通过相应的键盘命令来完成。除此之外,Autodesk公司还提供了丰富的快捷菜单和工具栏以提高用户的工作效率。但由于用户的专业不同,因此系统缺省的菜单往往不能完全满足不同专业的需要。如果能够根据自己的需要和习惯来合理的安排菜单的内容和布局,将能够使工作效率大幅度提高。
一、删除和插入菜单
要想对菜单进行定制,首先应该了解删除和插入菜单的方法。AutoCAD本身就提供了一些定制菜单的方法,下面我们将以AutoCAD 2000中文版为蓝本,具体介绍删除和插入菜单的操作方法。
也许您并不经常使用AutoCAD的“帮助”功能,下面的操作将删除AutoCAD标准菜单中的“帮助”菜单。删除菜单最简单的方法就是选择“工具”菜单下的“自定义菜单”命令,之后将出现“菜单自定义”对话框,该对话框分为“菜单组”和“菜单栏”两个选项卡。选择“菜单栏”选项卡,然后在“菜单栏”列表中选中“帮助”项,单击“删除”按钮来删除选中的“帮助”菜单,如图1所示。单击“关闭”按钮关闭对话框。此时帮助菜单已经被删除了。
与删除菜单相比,插入菜单的操作显得更为常用,毕竟多数时候我们是想对软件的功能进行扩充。AutoCAD 2000可以通过外部数据库来管理您的工作,但是AutoCAD的标准菜单栏并未提供有关数据库的功能。下面我们就将管理数据库的Data View(查看数据)菜单插入菜单栏中。
按照前面的方法打开“菜单自定义”对话框,单击选择“菜单组”选项卡,此时“菜单组”列表中有一个ACAD菜单组,这个菜单组就是AutoCAD的标准菜单组,包含了标准AutoCAD菜单栏中的全部11个菜单,而“查看数据”菜单并不包含在标准的ACAD菜单组中,所以必须装载包含此菜单的dbConnect菜单组。单击“浏览”按钮,打开“选择菜单文件”对话框,选择包含dbConnect菜单组文件dbcon.mun,单击“打开”按钮打开该文件,在弹出的提示对话框中单击“是”按钮(如图2所示),
生成MNS文件。这样“菜单组”列表中就增加了dbConnect菜单组。选择“菜单栏”选项卡,在“菜单组”列表框中选择dbConnect菜单组,在“菜单”列表框中选择“查看数据”菜单,选择插入位置后单击“插入”按钮(如图3所示),单击“关闭”按钮关闭对话框。这样,“查看数据”菜单就被插入到菜单栏中。
二、了解菜单文件内幕
通过第一节的介绍我们会发现,AutoCAD提供的菜单定制功能十分简单,不能满足各种专业的需要,那么AutoCAD的强大定制功能是如何实现的呢?原来AutoCAD的菜单文件是使用ASCII码格式存储的文件,使用任何文本编辑器都可以编辑。只要懂得菜单文件的格式和语法,就可以定制执行各种命令的菜单。这种定制方法尽管比较繁琐难学,但却为AutoCAD的菜单开发提供了更广阔的空间,下面我们就能深入研究菜单文件内幕。
菜单文件用于定义和显示AutoCAD中的各种菜单。菜单文件实际上是功能与格式各不相同的一组文件:MNU文件是模板菜单文件,是ASCII码格式;MNS文件是菜单源文件,也是ASCII码格式;MNR文件是菜单资源文件,二进制格式,包含菜单所用的资源;MNC文件是经过编译的菜单文件,AutoCAD可以识别的二进制格式;MNL文件是菜单LISP文件,包含菜单文件所用AutoLISP表达式;MND文件则是包含宏定义的特定菜单源文件,不经常使用。在这些文件当中,我们真正关心的是可以编辑的ASCII码文件,特别是MNU文件。如果了解这些菜单文件的生成和调用过程,就可以理解我们只关心MNU文件的原因了,因为其它菜单文件都是MNU文件生成的。
菜单模板文件是一个供用户编辑的ASCII文件,在这种文件里包含有较多的注释和适当的分隔符,便于使用者阅读和编辑。AutoCAD载入MNU文件后,它会自动生成一个MNS文件,这个文件也是ASCII码格式,内容与同名MNU文件基本相同,只是去除了多余的注释和分隔部分。AutoCAD将MNS文件作为进一步编译的源文件,MNS文件经过编译之后会生成一个程序可以直接调用的二进制MNC文件以及与之对应的资源文件MNR。这两种文件都是二进制格式,不可以直接编辑,这5种文件之间的关系如图4所示。
如果用户编辑的菜单命令中包含了AutoLISP表达式,则AutoCAD会将这些表达式存为MNL文件。AutoCAD在调用菜单文件(MNU、MNS、MNC)时,将搜索同名的MNL文件,若找到,则此MNL文件将被同时调入内存。在对其它菜单文件进行更名操作时,一定要同时将相应的MNL文件更名。不然,会因为菜单命令内AutoLISP表达式无法求值而引起错误。菜单文件储存在AutoCAD安装路径的Support子目录下,AutoCAD的标准菜单的文件名是ACAD.MNU。为了学习菜单的定制和开发技术,深入研究一下ACAD.MNU文件是很要必要的。在Support子目录中找到ACAD.MNU文件,用文本编辑器打开它。
文件的开始处是以“//”开头的几行注释,主要是一些版本和版权信息的描述。注释行之后的第一行描述了该文件定义的菜单组名,该行的语法是:“***MENUGROUP=菜单组名”(如图5所示),
这里的ACAD.MNU文件定义的菜单组名是ACAD。继续分析这个文件,就会发现它是由许多区域组成的,这些区域的共同点就是第一行都是以“***”开头,而且在区域的开始处都有以“//”开头的几行注释来说明此节的功能。区域名声明的语法为:“***SECTION NACE”,表示以下各行为一个区域,区域名为SECTION NAME。三个星号开头的行表示这一区域的区域名,区域名不可以随意定义,AutoCAD只支持下表列出的区域名。
=================================================================================== 部分区域名 菜单区域的功能 备注
===================================================================================
***BUTTONSn 第n个定点设备按钮菜单区域 n=1~4
***AUXn 第n个系统定点设备菜单区域 n=1~4
***POPn 第n个菜单区域 n=1~499
****TOOLBARS 工具栏定义区域
***IMAGE 图像控件菜单区域
***SCREEN 屏幕菜单区域
***TABLETn 第n个数字化仪菜单区域 n=1~4
***HELPSTRINGS 帮助文本区域
***ACCELERATORS 快捷键定义区域
=================================================================================== “***BUTTONSn”和“***AUXn”定义了定点设备(如鼠标或数字化仪)的按钮在按下时AutoCAD发生的行为。如果修改了这些区域,AutoCAD的行为将产生很大混乱,甚至可能会导致应用程序的瘫痪。因此,在没有必要的情况下,不要对这两类菜单进行任何修改。
区域名为“POPn”的菜单项有两类,分别为下拉菜单和快捷菜单。下拉菜单和快捷菜单才是我们通常意义上的Windows标准菜单,即触发时弹出的菜单,这种形式的菜单在Windows中称为级联菜单(也称为步进菜单或层次菜单),下拉菜单总是从菜单栏中下拉,快捷菜单则是显示在图形屏幕上十字光标所在或靠近十字光标的位置,以及图形屏幕、文本窗口、命令行或工具栏区域上光标的位置。快捷菜单通过“$P0=*”菜单命令来访问,该命令由其它菜单项产生,或由AutoLISP或ObjectARX程序发出。例如,在绘图区单击鼠标右键弹出的菜单就是快捷菜单。当快捷菜单被激活时,菜单栏不可用。这两种菜单区域的语法是相同的,对这两类菜单区域进行定制是本文所要讲述的主要内容。
除了Windows标准菜单外,AutoCAD还提供了其它形式的快捷方式来执行命令,例如工具栏、图像菜单、屏幕菜单、快捷键等。菜单文件的其它区域定义了这些快捷方式。“***TOOLBARS”部分指定工具栏的缺省布局和内容,它包含菜单所定义工具栏的子菜单,如图6所示。
图像控件菜单主要用来当用户选择一个图形符号时提供图像,图像控件菜单通过在菜单文件中提供“***IMAGE”部分来定义。
“***SCREEN”部分标签表示AutoCAD屏幕菜单的开始。屏幕菜单部分控制屏幕菜单区域。缺省情况下,屏幕菜单是禁用的。通过选择“工具/选项/显示”上的“显示屏幕菜单”,可启用屏幕菜单。
菜单文件中标签为“***TABLET1”到“***TABLET4”的四个部分定义了一些菜单宏,这些菜单宏与指定区域的数字化仪选择相关。AutoCAD最多可将数字化仪的四个区域配置为命令输入的菜单区域。
状态行帮助信息是帮助支持的一个重要方面,当菜单项被选择时,在状态行中显示这些简单的描述性信息。“***HELPSTRINGS”部分中的帮助字符串菜单区域支持这种格式的帮助,如图7所示。
AutoCAD支持用户定义的快捷键。“***ACCELERATORS”菜单区域定义了来自用户的快捷键。
三、建立自己的菜单
当AutoCAD提供的标准菜单不能满足用户需求时,我们可以通过修改菜单文件来开发自己的菜单。我们可以用修改ACAD.MNU文件的方法建立自己的菜单项。下面我们来制作一个最简单的菜单。
第一步:打开ACAD.MNU文件,在文件中输入如下字样:
***POP12
[绘制]
[直线] ^c^c^_line
[圆] ^c^c_circle
[文字] ^c^c_text
第二步:存盘并退出文本编辑器,然后进行AutoCAD绘图环境。
第三步:在AutoCAD的命令行中键入“MENU”命令,将出现“选择菜单文件”对话框。在“文件类型”下拉列表框中选择“菜单样板”文件类型,选中ACAD.MNU文件,单击“打开”按钮载入该文件。此时,程序弹出提示框,由于我们并没有对工具栏进行修改,所以单击“是”按钮继续载入ACAD.MNU文件。
这样,我们就建立了一个简单的菜单项(如图8所示),尽管很简单,但是基本说明定制菜单的方法,现在您可以试一试每个菜单的功能了!
让我们回过头来看一下刚才添加的代码。“***POP12”这一行是菜单区域的区域名。ACAD菜单组中已经有11个菜单,所以我们将新建的菜单编号为12。为菜单区域编号不需要连续,只要不与前面的菜单区域重复就可以了。从[绘制]这一行开始的每一行都表示一个菜单项。每一个菜单项是菜单里的菜单标题,方括号内的内容称为菜单项标签,简称标签。在菜单项中的标签会显示在菜单栏中。接下来的三行都是菜单的菜单项。三行的结构相同,方括号内是菜单项的标题,方括号后的部分叫做菜单宏(Menu Macro),这部分是菜单命令的执行部分。
您可能发现了,菜单宏中的命令与在命令行中输入的命令行基本相同(如绘制直线命令line、画圆命令circle等),只是前面加了一些控制字符。其中“^”表示Ctrl键按下的状态,^C相当于按一次+组合键,即中断当前命令。连续两个“^C”可以保证菜单的命令一定能被执行。下划线“_”用于将其后的字符转换成AutoCAD命令和关键字。
菜单宏是与菜单项对应的命令序列,可以对菜单宏进行编程来实现复杂的功能。许多特殊字符也可以应用在菜单宏中实现一些系统功能,下表列出了可用于菜单宏的特殊字符。
======================================================================
字符 说明
======================================================================
; 产生ENTER
^M 产生ENTER
^I 产生TAB
SPACEBAR 输入空格;菜单项中命令序列之间的空格等价于按SPACEBAR
\ 暂停以等候用户输入(不能用在快捷键部分)
- 转换AutoCAD命令及其后的关键字
+ 延续菜单宏到下一行(如果是最后一个字符)
=* 显示当前顶层的图像、下拉菜单或快捷菜单
*^C^C 重复项的前缀
$ 加载菜单部分或输入条件DIESEL宏表达式($M=)的特殊字符
^B ^B切换捕捉开或关(CTRL+B)
^C 取消命令(ESC)
^D 切换坐标显示开或关(CTRL+D)
^E 设置下一个等轴测平面(CTRL+E)
^G 切换栅格开或关(CTRL+G)
^H 产生退格
^O 切换正交模式开或关(CTRL+O)
^P 切换MENUECHO开或关
^Q 显示所有提示、状态列表和打印输入(CTRL+Q)
利用AutoCAD提供的特殊字符可以制作各种特殊效果的菜单。我们将前面介绍的POP12菜单区域稍作修改,制作一些特殊的菜单,如分隔线、子菜单、被禁用的菜单等。修改后的菜单代码如下:
***POP12
[绘制]
[直线(&L)\tCtrl+L] ^c^c^_line
[->圆] ^c^c_circle
[R50圆] ^c^c_circle \50
[<-R80圆] ^c^c_circle \80
[--]
[~文字] ^c^c_text
使用Menu命令重新载入ACAD.MNU菜单样板文件,可以发现我们自制的“绘制”菜单增加了快捷键、子菜单、分隔线和禁用菜单
在上面的代码中,“直线”菜单项增加了带下划线的菜单热键(L),还增加了快捷键CTRL+L。它的标签由[直线]变成了[直线(&L)\tCtrl+L]。其中“&”的作用是给“&”后的第一个字符加上下划线,并将其作为该菜单项的菜单热键;“\t”的作用是将其后的所有文字推向右边,即靠右对齐。菜单项“圆”的下面增加了两个子菜单。子菜单由一对特殊符号进行定义,符号“->”用在父菜单项标签的开头,表示这个菜单项含有子菜单;符号“<-”用在最后一个子菜单项标签的开头,表示这个菜单项是整个子菜单的最后一项。值得注意的是:这两个符号必须成对出现。AutoCAD会自动忽略不能与其它符号匹配的符号,这样“圆”菜单项也已经失去了原有的画圆功能。这是因为如果一个菜单项含子菜单,AutoCAD会自动忽略含该菜单项的菜单宏,这与Windows中的层叠菜单是相同的。菜单项“圆”的下面多了一条分隔线,这条分隔线是由两个连字符“[-]”产生的,分隔线不能被选中,其后的任何菜单宏都会被忽略。在一个菜单项的标签开始处加一个波浪线“~”就可以禁用该菜单项。“文字”菜单项就进行了这样的处理。被禁用的菜单项会变为灰色,不能被选中。当然,创建一个总是被禁用的菜单项是没有任何意义的,禁用符号通过都和AutoLISP语言的条件判断表达式组合使用,达到在特定状态下禁用特定菜单项的目的。例如在文本编辑器中,如果没有进行复制或剪切操作,那么粘帖菜单项就处于被禁用状态。
-- 下拉菜单或快捷菜单中的菜单项分隔符(使用时,不能包括其它任何字符)
+ 延续宏到下一行(如果是最后一个字符)
-> 指出下拉菜单或快捷菜单具有子菜单
<- 指出子菜单中的最后一个下拉菜单项或快捷菜单项
<-<-... 指出子菜单中的最后一个下拉菜单项或快捷菜单项并且结束父菜单。(每个<-结束一级
父菜单)
$( 如果作为第一个字符,则使下拉菜单或快捷菜单项标签求DIESEL字符串宏的值
~ 禁用菜单项的前缀符
!. 给菜单项打上复选标记的前缀符
& 直接放在下拉菜单或快捷菜单标签中一个字符之前,把该字符指定义菜单的热键。例如, S&le则将字每a下显示一条下划线
/ 指定下拉菜单或快捷菜单标签的菜单热键,通常与&符号配合使用
\t 把标签中这两个字符右边的文件置于菜单的右侧
四、进一步完善菜单
我们继续对菜单进入完善,包括给菜单项指定快捷键和增加状态栏提示信息,仍然是通过修改菜单文件来完成。前面我们定义的菜单中有一个小毛病没有克服:虽然我们在“直线”菜单项中写出该菜单项的快捷键是“Ctrl+L”,但我们并没有真正为这个菜单项分配任何快捷键。如果我们能把这个小小的Bug也去掉,那我们的菜单就尽善尽美了。
分配快捷键涉及到两个菜单区域:一个是菜单项所在菜单区域,在我们前面的例子中就是定义菜单“绘制”的“***POP12”菜单区域;另一个就是专门定义快捷键的菜单区域“***ACCELERATORS”。为了两个菜单区域可以进行正确的通讯,必须为需要快捷键的“直线”菜单项定义一个唯一而规范的名称,AutoCAD把这个名称叫做“名称标记”。名称标记是将一个菜单项与其它菜单项区别开的唯一标志。名称标记只能是字母和下划线的组合,放在菜单项标签之前,就能把标签作为名称标记,因为标签的命名规则太笼统,而且同一个标签名可以出现在不同的菜单区域当中。为了给菜单项分配快捷键,首先应该给每个菜单项一个有意义而且唯一的菜单标记,现在我们还是以前面的例子为每个菜单项定义菜单标记,其代码如下:
***POP12
**MyDraw
ID_MyDraw [绘制]
ID_MyLine [直线(&L)\tCtrl+L] ^c^c^_line
ID_MyCircle [->圆] ^c^c_circle
ID_RFCrl [R50圆] ^c^c_circle \50
ID_RECrl [<-R80圆] ^c^c_circle \80
[--]
ID_MyText [~文字] ^c^c_text
接下来,我们为“直线”菜单项分配快捷键。找到“***ACCELERATORS”菜单区域,它通常在菜单样板文件的末尾处,在此区域添加如下字样:
ID_MyLine [CONTROL+"L"]
注意要把这些文字添加在“***ACCELERATORS”区域的第一行。存盘退出文本编辑器,在AutoCAD中执行Menu命令重新载入ACAD.MNU文件,按下Ctrl+L键,AutoCAD开始执行Line命令。这里我们只为直线菜单项定义了快捷键,您完全可以根据需要给其它菜单项定义快捷键。
理解了为菜单项增加快捷键的方法,增加状态栏帮助文本就显得很简单了。在菜单样板文件中有一个菜单区域“***HELPSTRINGS”,这个菜单区域保存了其它菜单项的帮助文本,找到这个菜单区域,在这个菜单区域内添加如下代码。
ID_MyLine [绘制直线]
ID_RFCrl [绘制一个半径为50的圆]
ID_RECrl [绘制一个半径为80的圆]
存盘退出文本编辑器,在AutoCAD中执行Menu命令重新载入ACAD.MNU文件,再把光标指向“绘制”菜单中的某个菜单项时,状态栏中就是显示相应的提示信息
现在我们已经基本建立了一个完整的菜单框架,您是否感觉这个开发过程有些繁琐呢?在冗长的ACAD.MNU文件中查找特定的菜单区域以及菜单样板文件缓慢的编译过程都不是一件很容易的事,下面将介绍一个更简单的方法来开发菜单。
用文本编辑器建立一个文本文件,这个文件将我们在前面开发的所有内容综合在一起,文件内容如下:
***MENUGROUP=MyCAD
***POP12
ID_MyDraw [绘制]
ID_MyLine [直线(&L)\tCtrl+L] ^c^c^_line
ID_MyCircle [->圆] ^c^c_circle
ID_RFCrl [R50圆] ^c^c_circle \50
ID_RECrl [<-R80圆] ^c^c_circle \80
[--]
ID_MyText [~文字] ^c^c_text
***ACCELERATIORS
ID_MyLine [CONTROL+"L"]
***HELPSTRINS
ID_MyDraw [这是一个自定义的绘制菜单]
ID_MyLine [绘制直线]
ID_MyCircle [绘制圆]
ID_RFCrl [绘制一个半径为50的圆]
ID_RECrl [绘制一个半径为80的圆]
ID_MyText [在绘图区插入文字]
将此文件保存在AutoCAD的Support文件夹下,文件名称可以任意命名,我们这里保存为MyCAD.MNU。在AutoCAD中使用Menuload命令打开“菜单自定义”对话框,在“菜单栏”列表中将最下方的“绘制”菜单删除(也就是我们前面开发的菜单),在“菜单组”选项卡中载入MyCAD.MNU文件。在“工具栏”选项卡中插入“绘制”菜单项,单击“关闭”按钮关闭对话框。这时菜单栏中就有了新的“绘制”菜单项,正是我们在MyCAD.MNU文件中建立的。
由Menuload命令调入的菜单称为局部菜单,载入局部菜单时只是将局部菜单中包含的菜单项插入菜单栏中,而不会删除原有的菜单项。当我们想开发新的菜单项时,可以将菜单的有关定义写成一个单独的文件,然后把这个文件作为局部菜单载入即可。
作者:
goodsister
时间:
2005-5-9 12:31
菜单其实大家都会做,问题是怎么点击菜单就能调出对话框等。
作者:
stillwin
时间:
2005-5-24 09:27
是呀﹐樓主怎樣做才能做到點擊菜單能執行命令﹖
欢迎光临 iCAx开思网 (https://www.icax.org/)
Powered by Discuz! X3.3