摘要] 简单介绍AutoCAD绘图软件的二次开发方法,并通过利用AutoLISP语言编制的具体应用程序,说明对AutoCAD进行二次开发使得工程绘图效率大为提高。
关键词:计算机绘图;二次开发;AutoLISP语言;
程序编制
中图分类号:TP311.52
A Specific Example Showing the Secondary Development of AutoCAD in Engineering Drawing Making
1 前言
AutoCAD作为一种通用的绘图软件,在计算机辅助设计中广泛应用。但AutoCAD作为通用的CAD系统虽然具有内部丰富、功能强大的命令集,要满足许多专业方面的需要还存在很多不足,有时仍感到使用不便,需要进行二次开发,针对不同的专业增加一些新的功能,以提高设计效率。比如,在机械设计中常常要标注零部件序号,尽管可以实现,但是由于AutoCAD中没有相应的标注功能,序号标注包括对点圆、线、文字命令的操作,这样标注显然绘图效率很低。在动力系统设计中,经常要绘制各种阀门,如果对AutoCAD进行二次开发,实现使用灵活方便的阀门绘制程序,则可以大大地提高绘图速度,提高设计效率。
AutoCAD for Windows以 AutoLISP和ADS作为二次开发工具,ADS(Autodesk Development System)是基于C语言的开发环境,它允许C语言程序员开发实用程序以对AutoCAD的充分应用。另外,Microsoft的Visual Basic(VB)是windows下主要的开发工具之一,它以“可视化”和“事件驱动”特性,简化了面对windows的编程。在windows下,VB和AutoCAD都支持强有力的DDE(动态数据交换)功能,可以用VB编写客户程序通过Windows DDE 连接向AutoCAD传送指令和交换各种复杂的数据结构,实现对AutoCAD的控制。尽管AutoLISP运行速度慢,但是它为中高级的用户定制AutoCAD提供了很多便利。AutoCAD软件包提供了许多AutoLISP实现程序。
图2 序号标注流程图
3 程序的设计和实现
在本文中,简要介绍了利用AutoLISP语言编写的序号标注程序,以起抛砖引玉的作用。本程序是在AutoCAD-R12上开发并运行通过的。程序主要包括标注零部件序号、标注支吊架序号、标注分界符、标注文字等功能,如图1所示。同时可以设置文字高度和数字自动赋值。有了“序号标注”功能,你就可以很方便地连续地进行标注。
其流程图为:
在标注时首先拾取起始点,程序中设计了功能选项并显示:
T标注类型/H文字高度/N数字赋值/?帮助/〈起始点〉:
可以通过功能选项改变标注类型、文字高度,以及确定文字高度、序号数字是否连续赋值。其实现程序为
(defun 1b—m1 (/ input)
(setq temp T)
(while temp
(initget″ Type Height Number ?″)
(setq strtpt (getpoint ″ \nT 标注类型/H文字高度/N数字赋值/?帮助/〈起始点〉:″))
(cond
((= strtpt ″Type″)
(initget ″Part Brace Delimit Text″)
(setq input (getkword (strcat ″\nP
零部件序号/B支吊架序号/D分界符/T标注文字〈″1b—typ″>:″)))
(if input
(progn
(if(/=1b—typ input)(setq num 1))
(setq 1b—typ input)
)
)
)
((= strtpt ″Height″)
(setq input )getdist (strcat ″\n 输入新的文字高度<″(rtos txt—h)″>:″)))
(if input (setq txt—h input))
)
((= strtpt ″Number″)
(initger ″ON OFf″)
(setq input (getkword (strcat ″\n序号数字自动连续赋值?OFf/ON <″1b—num″>:″)))
(if input (setq 1b—num input))
)
((= strtpt ″?″)
(1b—hlp)
)
((null strtpt)
(princ ″\n正常退出LABEL.″)
(setq temp nil)
(setq cont nil)
)
(T
(setq temp nil)
)
) ;end of cond
);end of while
)
选择标注类型也是通过功能选项进行的,其显示选项为:
P零部件序号/B支吊架序号/D分界符/T文字标注:
如果起始点空输入,则退出标注功能。在完成起始点选择后,紧接着要求拾取文字标注的位置,显示功能选项:
H文字高度/N数字赋值/U退回/?帮助/〈终止点〉:
在该过程中仍可以设置文字高度和数字自动赋值开关。实现程序为
(defun 1b—m2 (/ input)
(setq temp T)
(while temp)
(menucmd ″S=labe12″)
(initget ″Height Number Undo ?″)
(setq nextpt (getpoint strtpt ″\nH 文字高度/N数字连续/U退回/?帮助/〈终止点〉:″))
(cond
((= nextpt ″Height″)
(seta input (getdist (strcat“\n输入新的文字高度<“(rtos.txt—h″:)>″)))
(if input (setq txt—h input)))
((=strtpt “Number″)
(initget ″ON OFf″)
(setq input (getkword (strcat ″\n序号数字自动连续赋值?OFf/ON <″ 1b_num″>:″)))
(if input (setq lb_num input))
)
((= nextpt ″Undo″)
(command ″—.U″)
(setq temp nil)
)
((= strtpt ″?″)
(lb—hlp)
)
(T
(if (null nextpt)
(setq temp T)
(progn
(cond
((= lb—typ ″Part″) (lb—part))
((= lb—typ ″Brace″) (lb—brace))
((= lb—typ ″Delimit″) (lb—deli))
((= lb—typ ″Text″) (lb—text))
)
(setq temp nil)
)
)
)
) ;end fo cond
)end of while
)
在选择好终止点之后,要求输入相应的标注内容。例如,零部件序号和分界符标注过程分别表达为
(defun lb—part(/ ang endpt midpt)
(setq ang (angle strtpt nextpt))
(if (and (> ang (/ pi 2))(<ang (* pi 1.5)))
(setq endpt (polar nextpt o (* txt—h-1.6)))
(setq endpt (polar nextpt o (* txt—h 1.6)))
)
(command ″donut″ 0 0.3 strtpt ″″ ″line″)
strtpt nextpt endpt ″″)
(setq midpt (mapcar' + nextpt endpt)
midpt (mapcar'/midpt'(2 2 2))midpt (mapcar'/midpt'(0 4 0)))
(if (=lb—num ″OFf″)
(\progn
(setq temp (getint (strcat ″\n 请输入零部件序号〈″rtos num)″>:″)))
(if temp (setq num temp))
)
)
(command ″text″ ″J″ ″M″ midpt txt—h 0 num ″change″ ″L″ ″″ ″P″ ″C″ 6 ″″)
(setq num (1+num))
(defun lb—del(/ txt ang radius centpt)
(setq radius txt—h)
(setq ang (angle strtpt nextpt))
(setq centpt (polar nextpt ang radius))
(command ″donut″ 0 0.3 strtpt ″″ ″line″ strtpt nextpt″″)
(command ″circle″ centpt radius)
(setq txt (getstring ″\n 请输入分界符序号:″))
(command ″text″ ″J″ ″M″ centpt txt—h o txt 0 txt ″change″ ″L″ ″″ ″P″ ″C″ 6″″)
)
程序通过循环语句实现多次标注,当起始点空输入时退出标注。
在运行程序功能之前,必须将其调入AutoCAD中。只要在Command状态下,键入(Load″C:/SUBDIR/lABEL″)即可。对于常用的功能,可以把它放入菜单文件中。可在所使用的菜单文件(如ACAD.MNU)中的下拉式采单或屏幕菜单部分加入一句:
|