autocad自帶命令rec繪制矩形
在Autocad中,rec命令可以迅速繪制一個矩形。

自定義函數(shù)繪制矩形
- 代碼
我們現(xiàn)在使用autolisp來仿寫這個功能。首先展示下全部的代碼:
;defun 函數(shù)名()()是autolisp命名函數(shù)的形式
;函數(shù)名之前加上c:,可以在autocad中直接輸入函數(shù)名作為命令名
;setq 變量名,是autolisp給變量賦值的方式
;getpoint 提示點(diǎn)選輸入一個點(diǎn)
;getreal 提示輸入一個實(shí)數(shù)
(defun c:pbox()
; a點(diǎn), w寬, h高
(setq a (getpoint "select a point:"))
(setq w (getreal "\nwidth:"))
(setq h (getreal "\nheight:"))
;b, c, d矩形的另外四個點(diǎn)的坐標(biāo)值,由a,w,h計(jì)算得出
(setq b (polar a 0 w))
(setq c (polar b (/ pi 2) h))
(setq d (polar c pi w))
;根據(jù)a,b,c,d四個點(diǎn)繪制矩形
(command "pline" a b c d "c")
)
;消除末尾提示nil
(princ)
2.思路講解
-
矩形的屬性
要想定義一個矩形,就要先把矩形的屬性理清,這里,我們將一個矩形的四個點(diǎn)分別命名為a,b,c,d。而矩形的高是h,寬是w。
image.png 必要條件
想要在圖上繪制這樣的矩形,至少要用戶輸入其中一個點(diǎn)的位置,還有寬和高。
于是,我們使用(setq a ())這個函數(shù)指定a點(diǎn)。而a點(diǎn)的指定是用(getpoint)這個函數(shù),讓用戶在屏幕上指定。
(getreal)是讓用戶輸入一個實(shí)數(shù),當(dāng)做w和h的值。
\n是換行符。計(jì)算值
除了a點(diǎn),另外三個點(diǎn)就可以利用已知條件計(jì)算出來了。
這里,我們使用(polar 基點(diǎn) 弧度 距離)函數(shù)來計(jì)算另外三個點(diǎn)。
polar函數(shù)的第一個參數(shù)是基點(diǎn),也就是起始點(diǎn)a。
第二個參數(shù)是弧度,實(shí)際上就是角度,是從基點(diǎn)出發(fā)的這條線偏轉(zhuǎn)的角度,你將角度轉(zhuǎn)換為弧度填在這里就行了。
第三個距離參數(shù)很好理解,就是線的長度。
于是,b點(diǎn),就是從a出發(fā),偏轉(zhuǎn)0度,長度為w;
c點(diǎn),從b出發(fā),偏轉(zhuǎn)90度,長度為h;
d點(diǎn),從c出發(fā),偏轉(zhuǎn)180度,長度為w。
- 繪制矩形
至此,我們就有了a,b,c,d四個點(diǎn)的坐標(biāo),使用(command)調(diào)用autocad的pline命令就好了。
(command "pline" a b c d "c")
運(yùn)行命令
加載函數(shù)文件,然后輸入pbox,按照提示輸入相應(yīng)的值即可。
最后的效果如下:

再加點(diǎn)功能
現(xiàn)在,我們讓這個程序變得稍微再復(fù)雜一些。比如,將這個矩形改成田字格。

也就是在矩形的水平和垂直的位置,分別加一道線line。
所以,我們要得到line端點(diǎn)的坐標(biāo)。
使用之前的
polar函數(shù),結(jié)合已經(jīng)知道的a,b,c,d四個點(diǎn)的坐標(biāo),我們很容易得到line的端點(diǎn)。
(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點(diǎn), w寬, h高
(setq a (getpoint "select a point:"))
(setq w (getreal "\nwidth:"))
(setq h (getreal "\nheight:"))
;b, c, d矩形的另外四個點(diǎn)的坐標(biāo)值,由a,w,h計(jì)算得出
(setq b (polar a 0 w))
(setq c (polar b (/ pi 2) h))
(setq d (polar c pi w))
;根據(jù)a,b,c,d四個點(diǎn)繪制矩形
(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 "")
)
但是,我們以后寫的代碼絕對不會這么簡單,隨著代碼逐漸復(fù)雜,除了加入詳盡的代碼注釋,我們還需要組織好代碼結(jié)構(gòu)。我們可以將上面這段代碼分成三個函數(shù)
-
box()繪制一個矩形 -
midLine()添加中心線 -
pbox()組織邏輯順序并運(yùn)行函數(shù)
代碼看起來是這樣的:
; box 繪制一個矩形
(defun box()
;a點(diǎn), w寬, h高
(setq a (getpoint "select a point:"))
(setq w (getreal "\nwidth:"))
(setq h (getreal "\nheight:"))
;b, c, d矩形的另外四個點(diǎn)的坐標(biāo)值,由a,w,h計(jì)算得出
(setq b (polar a 0 w))
(setq c (polar b (/ pi 2) h))
(setq d (polar c pi w))
;根據(jù)a,b,c,d四個點(diǎn)繪制矩形
(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 主函數(shù),體現(xiàn)邏輯順序
(defun c:pbox()
(box) ;先繪制一個矩形
(midLine) ;再給盒子加中線
(princ) ;消除末尾提示nil
)
觀察主函數(shù),是不是看起來就清晰多了。如果程序出現(xiàn)了什么問題,我們也很容易定位。
最重要的是,按照這樣的邏輯,我們就能寫出更加復(fù)雜的代碼。
運(yùn)行程序
最后,看下上面這段代碼最終運(yùn)行的效果:

