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实现程序。
图1 标注类型 |
图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)中的下拉式采单或屏幕菜单部分加入一句: |