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

目标:

绘制N阶楼梯,人机交互两点确定楼梯底边,人机交互获取楼梯高度和阶数,根据输入的参数绘制楼梯。预期效果如图:
在这里插入图片描述

代码:

(defun C:DrawStair(
    /
    #iCmdEcho               ;; 人机交互系统变量值
    #iOsMode                ;; 捕捉方式系统变量值
    #ptStair1 
    #ptStair2               ;; 用于确定楼梯底边的两点
    #iStepNum               ;; 楼梯踏步数
    #dHeight                ;; 楼梯高度
    #dAngle                 ;; 楼梯倾斜角度
    #ptMax                  ;; 楼梯最大点
    #dStepLength            ;; 步长
    #dStepHeight            ;; 步高
    #i
    #lsPlineList            ;; 多段线数据列表
    )

    ;; 获取当前的人机交互和捕捉的状态
    (setq #iCmdEcho (getvar "CMDECHO"))
    (setq #iOsMode (getvar "OSMODE"))

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

    ;; 获取矩形的边框点
    (setq 
        #ptStair1 (getpoint "\n请指定楼梯底边第一点:")
        #ptStair2 (getpoint #ptStair1 "\n指定楼梯底边第二点:")
        #dAngle (angle #ptStair1 #ptStair2)

        ;; 获取楼梯的高度和踏步数,计算最大点、步长、步高
        #dHeight (getdist "\n指定楼梯高度:")
        #iStepNum (getint "\n请指定楼梯踏步数:")
        #ptMax (polar #ptStair1 (+ #dAngle (* 0.5 PI)) #dHeight)
        #dStepLength (/ (distance #ptStair1 #ptStair2) #iStepNum)
        #dStepHeight (/ #dHeight #iStepNum)
    );setq

    ;; 初始化多段线列表
    (setq #lsPlineList (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") 
        (cons 90 (+ 3 (* 2 #iStepNum))) (cons 70 1) 
        (cons 10 #ptMax) (cons 10 #ptStair1) (cons 10 #ptStair2))
    );setq

    ;; 循环计算点坐标
    (setq #i 0)
    (while (< #i #iStepNum)
        (setq 
            #ptStair1 (polar #ptStair2 (+ #dAngle (* 0.5 PI)) #dStepHeight)
            #ptStair2 (polar #ptStair1 (+ #dAngle PI) #dStepLength)
            #lsPlineList (append #lsPlineList (list (cons 10 #ptStair1)))
            #lsPlineList (append #lsPlineList (list (cons 10 #ptStair2)))
            #i (1+ #i)
        );setq
    );while

    ;; 生成多段线
    (entmake #lsPlineList)

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

    ;; 消除函数返回值
    (prin1)
)
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值