autolisp案例-入门级-绘制指定尺寸的矩形

autocad自带命令rec绘制矩形

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

pp3w1-ix83a.gif

自定义函数绘制矩形

  1. 代码
    我们现在使用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,按照提示输入相应的值即可。
最后的效果如下:

idrs5-8oy51.gif

再加点功能

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

image.png

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

但是,我们以后写的代码绝对不会这么简单,随着代码逐渐复杂,除了加入详尽的代码注释,我们还需要组织好代码结构。我们可以将上面这段代码分成三个函数

  1. box() 绘制一个矩形
  2. midLine() 添加中心线
  3. 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

)

观察主函数,是不是看起来就清晰多了。如果程序出现了什么问题,我们也很容易定位。
最重要的是,按照这样的逻辑,我们就能写出更加复杂的代码。

运行程序

最后,看下上面这段代码最终运行的效果:


r222f-e23dd.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容