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
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空