目标:
绘制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)
)