autocad自带命令rec绘制矩形
在Autocad中,rec
命令可以迅速绘制一个矩形。

自定义函数绘制矩形
- 代码
我们现在使用autolisp来仿写这个功能。首先展示下全部的代码:
;defun 函数名()()是autolisp命名函数的形式
;函数名之前加上c:,可以在autocad中直接输入函数名作为命令名
;setq 变量名,是autolisp给变量赋值的方式
;getpoint 提示点选输入一个点
;getreal 提示输入一个实数
(defun c:pbox()
; a点, w宽, h高
(setq a (getpoint "select a point:"))
(setq w (getreal "\nwidth:"))
(setq h (getreal "\nheight:"))
;b, c, d矩形的另外四个点的坐标值,由a,w,h计算得出
(setq b (polar a 0 w))
(setq c (polar b (/ pi 2) h))
(setq d (polar c pi w))
;根据a,b,c,d四个点绘制矩形
(command "pline" a b c d "c")
)
;消除末尾提示nil
(princ)
2.思路讲解
-
矩形的属性
要想定义一个矩形,就要先把矩形的属性理清,这里,我们将一个矩形的四个点分别命名为a,b,c,d。而矩形的高是h,宽是w。
image.png 必要条件
想要在图上绘制这样的矩形,至少要用户输入其中一个点的位置,还有宽和高。
于是,我们使用(setq a ())
这个函数指定a点。而a点的指定是用(getpoint)
这个函数,让用户在屏幕上指定。
(getreal)
是让用户输入一个实数,当做w和h的值。
\n
是换行符。计算值
除了a点,另外三个点就可以利用已知条件计算出来了。
这里,我们使用(polar 基点 弧度 距离)
函数来计算另外三个点。
polar函数的第一个参数是基点,也就是起始点a。
第二个参数是弧度,实际上就是角度,是从基点出发的这条线偏转的角度,你将角度转换为弧度填在这里就行了。
第三个距离参数很好理解,就是线的长度。
于是,b点,就是从a出发,偏转0度,长度为w;
c点,从b出发,偏转90度,长度为h;
d点,从c出发,偏转180度,长度为w。
- 绘制矩形
至此,我们就有了a,b,c,d四个点的坐标,使用(command)
调用autocad的pline
命令就好了。
(command "pline" a b c d "c")
运行命令
加载函数文件,然后输入pbox
,按照提示输入相应的值即可。
最后的效果如下:

再加点功能
现在,我们让这个程序变得稍微再复杂一些。比如,将这个矩形改成田字格。

也就是在矩形的水平和垂直的位置,分别加一道线line。
所以,我们要得到line端点的坐标。
使用之前的
polar
函数,结合已经知道的a,b,c,d四个点的坐标,我们很容易得到line的端点。
(setq mp1 (polar d 0 (/ w 2)))
(setq mp2 (polar a 0 (/ w 2)))
(setq mp3 (polar a (/ pi 2) (/ h 2)))
(setq mp4 (polar b (/ pi 2) (/ h 2)))
(command "line" mp1 mp2 "")
(command "line" mp3 mp4 "")
代码组织
我们可以将上面的这段新代码,加入到之前的defun c:pbox()
的末尾,看起来是这样的:
(defun c:pbox()
; a点, w宽, h高
(setq a (getpoint "select a point:"))
(setq w (getreal "\nwidth:"))
(setq h (getreal "\nheight:"))
;b, c, d矩形的另外四个点的坐标值,由a,w,h计算得出
(setq b (polar a 0 w))
(setq c (polar b (/ pi 2) h))
(setq d (polar c pi w))
;根据a,b,c,d四个点绘制矩形
(command "pline" a b c d "c")
;绘制中线
(setq mp1 (polar d 0 (/ w 2)))
(setq mp2 (polar a 0 (/ w 2)))
(setq mp3 (polar a (/ pi 2) (/ h 2)))
(setq mp4 (polar b (/ pi 2) (/ h 2)))
(command "line" mp1 mp2 "")
(command "line" mp3 mp4 "")
)
但是,我们以后写的代码绝对不会这么简单,随着代码逐渐复杂,除了加入详尽的代码注释,我们还需要组织好代码结构。我们可以将上面这段代码分成三个函数
-
box()
绘制一个矩形 -
midLine()
添加中心线 -
pbox()
组织逻辑顺序并运行函数
代码看起来是这样的:
; box 绘制一个矩形
(defun box()
;a点, w宽, h高
(setq a (getpoint "select a point:"))
(setq w (getreal "\nwidth:"))
(setq h (getreal "\nheight:"))
;b, c, d矩形的另外四个点的坐标值,由a,w,h计算得出
(setq b (polar a 0 w))
(setq c (polar b (/ pi 2) h))
(setq d (polar c pi w))
;根据a,b,c,d四个点绘制矩形
(command "pline" a b c d "c")
)
; midLine 给box加中线
(defun midLine()
(setq mp1 (polar d 0 (/ w 2)))
(setq mp2 (polar a 0 (/ w 2)))
(setq mp3 (polar a (/ pi 2) (/ h 2)))
(setq mp4 (polar b (/ pi 2) (/ h 2)))
(command "line" mp1 mp2 "")
(command "line" mp3 mp4 "")
)
; main 主函数,体现逻辑顺序
(defun c:pbox()
(box) ;先绘制一个矩形
(midLine) ;再给盒子加中线
(princ) ;消除末尾提示nil
)
观察主函数,是不是看起来就清晰多了。如果程序出现了什么问题,我们也很容易定位。
最重要的是,按照这样的逻辑,我们就能写出更加复杂的代码。
运行程序
最后,看下上面这段代码最终运行的效果:
