AutoCAD是美国Autodesk公司推出的优秀的计算机辅助设计软件,
其内嵌式的AutoLisp语言,更给进行二次开发的用户提供了一个强大
的工具。本人在长期进行CAD辅助绘图的实践中总结出了一些经验,编
制了一些小程序,用于解决在CAD绘图中经常碰到的一些小问题,并且
希望能够抛砖引玉,同读者朋友们互相交流,共同提高。
1.在绘图屏幕上方状态条显示系统时间和绘图比例
在绘图过程中,用户有时想知道当前的绘图比例是多少,或者想知
道现在是什么时间。虽然在AutoCAD中有Dimscale和Time这两个系统
命令可以显示出想要知道的东西,但是每次都要键入这些命令显然很
麻烦。其实解决这个问题的方法非常简单,只要在acad.mnl中的C::St
a rtup()中加入下列几句DIESEL说明程序,就能够做到在每次打开一
张图时,在屏幕绘图区的上方显示出系统时间及绘图比例,且时间的显
示会随时间变化而变化。
(setvar ″MODEMACRO″
(strcat
″$(substr,$(getvar,CLAYER),1,8)″ ;显示层名
″$(if,$(getvar,ORTHOMODE),Ortho,)″ ;显示正交状态
″$(if,$(getvar,SNAPMODE)″ ;显示捕捉状态
″Snap:$(if,″
″$(=,$(index,0,$(getvar,snapunit)),″
″$(index,1,$(getvar,snapunit))),″
″$(index,0,$(getvar,snapunit)),″
″/=″
″)″
″,″
″)″
″1:$(getvar,DIMSCALE)″ ;显示绘图比例
″ $(edtime,$(getvar,date),yy-m-dd H:MM:SSam/pm)″
;显示系统时间,精确到秒
)
)
2.任意变换绘图十字线的角度
这个小程序可以在绘图过程中任意改变绘图十字线的角度。这对
于画任意角度的直线及其垂直线是很有效的。键入CCA命令可以通过
选取相应的实体,使十字线同实体成正交状态, 用户便可在此实体上
画与之平行或垂直的线段了。如果想恢复到原来的状态只要另外再键
入RCA命令即可。
;;;File Name:myca.lsp
;;;By An Yuhui
;;;4-12-1995
;;;Function list:
;;; c:cca() change current angbase
;;; c:rca() recover current angbase
;;; **********
(defun c:cca()
(setq en(entsel))
(setq pt(cadr en))
(setq e1(entget (car en)))
(if(=(cdr (assoc 0 e1)) ″POLYLINE″)
(progn
(command ″explode″ pt)
(setq e1 nil)
(setq e1 (entget(entlast)))
)
)
(setq pt1(cdr (assoc 10 e1)))
(setq pt2(cdr (assoc 11 e1)))
(setvar ″snapang″ (angle pt1 pt2))
(setvar ″orthomode″ 1)
)
(defun c:rca()
(setvar ″snapang″0)
(setvar ″orthomode″)
)
3.实现尺寸线的连续标注
AutoCAD的DIM命令中有一个Continue连续标注命令,它的作用是
在标注完一个尺寸线后,在这条尺寸线的基础上对另一条开始进行标
注,其实在使用时仍要不断地键入命令,同时当标注水平的一连串线段
时,很有可能高高低低的对不齐。以下的程序可以实现真正意义上的
水平或垂直线段连续标注,方便易用,而且速度快!
;;;File Name:dimcont.lsp
;;;by An Yuhui
;;;1-25-1996
;;;Function:Continue Dimension
;;;**********
(defun c:dimcont()
(setq spt(getpoint ″\nFirst point:″))
(setq ept(getpoint spt ″\nEnd point:″))
(setq just-ang(angle spt ept))
(setq ss(ssget ″F″(list spt ept)))
(setq index 0 ptlist nil)
(while (setq et (ssname ss index))
(if(=(cdr (assoc 0 (entget et))) ″POLYLINE″)
(progn
(command ″EXPLODE″et)
(setq et(entlast))
)
)
(setq etlist (entget et))
(setq pt1(getvalue 10 etlist))
(setq pt2(getvalue 11 etlist))
(setq ptlist(cons (inters pt1 pt2 spt ept nil)ptlist))
(setq index(1+index))
)
(setq ptlist(sort1 ptlist))
(setq lastpt(car ptlist))
(setq ptlist(cdr ptlist))
(while(setq pt (car ptlist))
(cond((or(=just-and0) (=just-ang pi))
(command ″dim1″ ″hor″ lastpt pt pt ″″)
(setq ptlist(cdr ptlist))
(setq lastpt pt)
)
((or (=just-ang (*pi 0.5)) (=just-ang(* pi 1.5)))
(command ″dim1″ ″ver″ lastpt pt pt ″″)
(setq ptlist(cdr ptlist))
(setq lastpt pt)
)
)
)
(princ)
)
4.任意转换两个字符的位置
笔者在绘图时常常会遇到需要改变文本标注和说明位置的情况,
有时是两个文本字符位置的互换,有时是材料表中两行材料名的位置
互换。用一般的方法,是先把第一行文本move到一个位置,再把第二行
文本move到第一行文本原来的位置,最后再移动第一行文本到第二行
文本原来的位置,每次做起来总感到不方便,而且由于移动时的误差,
位置总是对不准。因此,笔者用AutoLisp编了一个小程序,用于解决这
个问题。每次使用时只要选择一下文本,再按回车,即能成功地转换二
个文本的位置。笔者在使用时获益非浅,现把它介绍给大家。
;;;Filenmae:chgtp.lsp
:::By An Yuhui
;;;7-19-1995
;;;Function:change two text position
;;;**********
(defun c:chgtp()
(setq el(ssget))
(setq len (sslength el))
(if (>len2)
(progn
(alert ″To Many Texts!″)
(exit)
)
)
(setq en1 (ssname el 0))
(setq en2 (ssname el 1))
(setq el1 (entget en1))
(set pt1 (cdr (assoc 10 el1)))
(setq el2 (entget en2))
(setq pt2 (cdr (assoc 10 el2)))
(command ″move″ en1 ″″ pt1 pt2)
(command ″move″ en2 ″″ pt2 pt1)
(redraw)
(princ)
)
5.巧用Point命令
在AutoCAD中,Point这个命令是常用的基本命令,也许由于它太简
单,许多用户常?:鍪恿怂?的作用,其实通过改变PDMODE这个系统变量
的值,Point命令可以发挥出意想不到的作用。下例图形为PDMODE在特
定值下Point命令画出的点的形状,为方便用户在绘图时选用,笔者特
地编制了一个可以随时在绘图过程中显示下面图形变量值的小程序,
用户在确定要选择的PDMODE值后, 用Redraw命令清屏即可回到原来的
绘图状态, 方便易用。图1
(defun c:pointcod()
(command ″vslide″ ″d:\\ayh\\prov\\point.sld″)
(princ)
)