AutoLisp从入门到放弃(二十二)

目标1:

交互获取两点确认矩形,以矩形中心为圆心,短边为半径画圆,并绘制矩形对角线在圆内的部分。预期效果如图:
在这里插入图片描述

代码

(defun C:DrawRectCir(
    /
    #iCmdEcho               ;; 人机交互系统变量值
    #iOsMode                ;; 捕捉方式系统变量值
    #ptRect1
    #ptRect2
    #ptRect3
    #ptRect4                ;; 确定矩形的四个点坐标
    #dLength                ;; 矩形长度
    #dWidth                 ;; 矩形宽度
    #ptMid                  ;; 矩形中心点
    #dRadius                ;; 圆半径
    #ptLine1                
    #ptLine2                ;; 用于绘制直线的点坐标
    )
    ;; 获取当前的人机交互和捕捉的状态
    (setq #iCmdEcho (getvar "CMDECHO"))
    (setq #iOsMode (getvar "OSMODE"))

    ;; 关闭所有捕捉和人机交互
    (setvar "CMDECHO" 0)
    (setvar "OSMODE" 0)

    ;; 获取矩形的边框点
    (setq 
        #ptRect1 (getpoint "\n请指定矩形的第一个点:")
        #ptRect3 (getcorner #ptRect1 "\n请指定矩形的另一个角点:")
    );setq

    ;; 计算矩形中心
    (setq #ptMid (polar #ptRect1 (angle #ptRect1 #ptRect3) (* (distance #ptRect1 #ptRect3) 0.5)))

    ;; 计算矩形的另外两个角点
    (setq
        #ptRect2 (list (car #ptRect3) (cadr #ptRect1) 0.0)
        #ptRect4 (list (car #ptRect1) (cadr #ptRect3) 0.0)
    );setq

    ;; 计算长宽以及半径
    (setq 
        #dLength (max (abs (- (car #ptRect1) (car #ptRect3))) (abs (- (cadr #ptRect1) (cadr #ptRect3))))
        #dWidth (min (abs (- (car #ptRect1) (car #ptRect3))) (abs (- (cadr #ptRect1) (cadr #ptRect3))))
        #dRadius (* 0.5 #dWidth)
    );setq

    ;; 生成多段线数据列表
    (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) (cons 10 #ptRect1) (cons 10 #ptRect2) (cons 10 #ptRect3) (cons 10 #ptRect4)))

    ;; 绘制圆
    (entmake (list (cons 0 "CIRCLE") (cons 100 "AcDbEntity") (cons 100 "AcDbCircle") (cons 10 #ptMid) (cons 40 #dRadius)))

    ;; 计算对角线并绘制
    (setq 
        #ptLine1 (polar #ptMid (angle #ptRect1 #ptRect3) #dRadius)
        #ptLine2 (polar #ptMid (angle #ptRect3 #ptRect1) #dRadius)
    );setq 
    (entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))

    ;; 计算对角线并绘制
    (setq 
        #ptLine1 (polar #ptMid (angle #ptRect2 #ptRect4) #dRadius)
        #ptLine2 (polar #ptMid (angle #ptRect4 #ptRect2) #dRadius)
    );setq 
    (entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))

    ;; 还原程序运行前的捕捉和人机交互状态
    (setvar "CMDECHO" #iCmdEcho)
    (setvar "OSMODE" #iOsMode)

    ;; 消除函数返回值
    (prin1)
)

目标2:

修改上述代码,实现短边对应的两段圆弧反向。预期效果如图:
在这里插入图片描述
代码:

(defun C:DrawRectArc(
    /
    #iCmdEcho               ;; 人机交互系统变量值
    #iOsMode                ;; 捕捉方式系统变量值
    #ptRect1
    #ptRect2
    #ptRect3
    #ptRect4                ;; 确定矩形的四个点坐标
    #dLength                ;; 矩形长度
    #dWidth                 ;; 矩形宽度
    #ptMid                  ;; 矩形中心点
    #dRadius                ;; 圆半径
    #ptLine1            
    #ptLine2                ;; 用于绘制直线的点坐标
    #ptArc1
    #ptArc2
    #ptArc3
    #ptArc4                 ;; 绘制圆弧的点坐标
    )
    ;; 获取当前的人机交互和捕捉的状态
    (setq #iCmdEcho (getvar "CMDECHO"))
    (setq #iOsMode (getvar "OSMODE"))

    ;; 关闭所有捕捉和人机交互
    (setvar "CMDECHO" 0)
    (setvar "OSMODE" 0)

    ;; 获取矩形的边框点
    (setq 
        #ptRect1 (getpoint "\n请指定矩形的第一个点:")
        #ptRect3 (getcorner #ptRect1 "\n请指定矩形的另一个角点:")
    );setq

    ;; 计算矩形的另外两个角点
    (setq
        #ptRect2 (list (car #ptRect3) (cadr #ptRect1) 0.0)
        #ptRect4 (list (car #ptRect1) (cadr #ptRect3) 0.0)
    );setq

        ;; 计算矩形中心
    (setq #ptMid (inters #ptRect1 #ptRect3 #ptRect2 #ptRect4))

    ;; 计算长宽以及半径
    (setq 
        #dLength (distance #ptRect1 #ptRect2)
        #dWidth (distance #ptRect2 #ptRect3)
        #dRadius (* 0.5 (min #dLength #dWidth))
    );setq

    ;; 生成多段线数据列表
    (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) (cons 10 #ptRect1) (cons 10 #ptRect2) (cons 10 #ptRect3) (cons 10 #ptRect4)))

    ;; 计算对角线并绘制
    (setq 
        #ptLine1 (polar #ptMid (angle #ptRect1 #ptRect3) #dRadius)
        #ptLine2 (polar #ptMid (angle #ptRect3 #ptRect1) #dRadius)
    );setq 
    (entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))

    ;; 计算对角线并绘制
    (setq 
        #ptLine1 (polar #ptMid (angle #ptRect2 #ptRect4) #dRadius)
        #ptLine2 (polar #ptMid (angle #ptRect4 #ptRect2) #dRadius)
    );setq 
    (entmake (list (cons 0 "LINE") (cons 100 "AcDbEntity") (cons 100 "AcDbLine") (cons 10 #ptLine1) (cons 11 #ptLine2)))

    ;; 计算圆弧相关点坐标
    (setq 
        #ptArc1 (polar #ptMid (angle #ptMid #ptRect1) #dRadius)
        #ptArc2 (polar #ptMid (angle #ptMid #ptRect2) #dRadius)
        #ptArc3 (polar #ptMid (angle #ptMid #ptRect3) #dRadius)
        #ptArc4 (polar #ptMid (angle #ptMid #ptRect4) #dRadius)
    );setq 

    ;; 绘制圆弧(需要判断那条边更长,以此来确定绘制圆弧的方向)
    (if (> #dLength #dWidth)
        (progn
            (command "arc" #ptArc1 "e" #ptArc2 "r" #dRadius)
            (command "arc" #ptArc3 "e" #ptArc2 "r" #dRadius)
            (command "arc" #ptArc3 "e" #ptArc4 "r" #dRadius)
            (command "arc" #ptArc1 "e" #ptArc4 "r" #dRadius)
        );progn
        (progn
            (command "arc" #ptArc2 "e" #ptArc1 "r" #dRadius)
            (command "arc" #ptArc2 "e" #ptArc3 "r" #dRadius)
            (command "arc" #ptArc4 "e" #ptArc3 "r" #dRadius)
            (command "arc" #ptArc4 "e" #ptArc1 "r" #dRadius)
        );progn
    );if

    ;; 还原程序运行前的捕捉和人机交互状态
    (setvar "CMDECHO" #iCmdEcho)
    (setvar "OSMODE" #iOsMode)

    ;; 消除函数返回值
    (prin1)
)
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值