autolisp案例-入門級-繪制指定尺寸的矩形

autocad自帶命令rec繪制矩形

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

pp3w1-ix83a.gif

自定義函數(shù)繪制矩形

  1. 代碼
    我們現(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)的值即可。
最后的效果如下:

idrs5-8oy51.gif

再加點(diǎn)功能

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

image.png

也就是在矩形的水平和垂直的位置,分別加一道線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ù)

  1. box() 繪制一個矩形
  2. midLine() 添加中心線
  3. 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)行的效果:


r222f-e23dd.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容