【求助】请问各位大神,这个画楼梯的程序画出来为什么不对劲?
本帖最后由 Marckie 于 2018-10-29 15:28 编辑大家好,这个程序是《AutoCAD程序设计魔法书》第7章的课后练习题,习题要求如下图所示:
,但是我的代码写出来后,实际效果十分不稳定,会出现下图两种情况:
,
代码如下:
;画楼梯,可选择楼梯方向******************************************************
(defun c:tt(/ pa pb pc p1 p2 p3 ww hh lw lh n side ldirect)
;;;;输入楼梯左下角点、楼梯总宽度、楼梯总高度和楼梯阶数
(setq pa (getpoint "\n 请选择楼梯左下角点:"))
(setq ww (getdist pa "\n 请输入楼梯总宽度w:"))
(setq hh (getdist pa "\n 请输入楼梯总高度h:"))
(setq n (getint "\n 请输入楼梯阶数(整数):"))
;选择楼梯方向
;(initget "L l R r");;;指定输入范围
(setq side (getstring "\n 请输入楼梯方向:(左/L)(右/R)"))
(setq side (strcase side));;全变成大写
(cond
((= side "L") (setq ldirect pi))
((= side "R") (setq ldirect 0))
)
;画出楼梯右下角墙壁线
(setq pb (polar pa ldirect ww))
(setq pc (polar pb (* pi 0.5) hh))
(command "pLINE" pa pb pc "")
;;赋值
(setq lw (/ ww n))
(setq lh (/ hh n))
(princ "\n 一阶楼梯宽") (princ lw)
(princ "\n 一阶楼梯高") (princ lh)
;;进入循环前的准备
(setq p1 pa)
(command "PLINE") ;;;;进入循环前先执行多段线命令,可将楼梯变为多段线
;;进入循环
(repeat n
(setq p2 (polar p1 (* pi 0.5) lh))
(setq p3 (polar p2 ldirect lw))
(commandp1 p2 p3)
(setq p1 p3)
)
(command "")
(princ "\n 画楼梯任务完成")
(prin1)
)
(prompt "\n 画楼梯程序(可选择楼梯方向),命令:tt")
(prin1)
请问各位大神为什么会出现上图中这种不规则阶梯的情况呢?求解答!!!!!
使用command的时候是需要关闭或取消捕捉,你也可以换一种方式,在commmand提示需要点的时候前面加_non 临时取消捕捉,另外如果是 (setvar "osmode" 0);关闭捕捉 这种方式,就需要命令完成后恢复该变量的值。
个人建议不要设置为0,最好是将捕捉值+-16384来实现F3键的操作。这才是关闭和开启对象捕捉的关键,而不是设置为0,也可以说,设置0算是一个错误的方式,建议不要用。。
提供秋枫大神的捕捉开关函数参考。
(defun qf-disable-osmode()
(setvar "osmode" (logior (getvar "osmode") 16384)) ; turn it off: 16384=0x4000
)
(defun qf-enable-osmode()
(setvar "osmode" (logand (getvar "osmode") 49151)) ; turn it on: 49151=0xBFFF
)
代码采用command _non临时取消捕捉方式参考。
;画楼梯,可选择楼梯方向******************************************************
(defun c:tt(/ pa pb pc p1 p2 p3 ww hh lw lh n side ldirect)
;;;;输入楼梯左下角点、楼梯总宽度、楼梯总高度和楼梯阶数
(setq pa (getpoint "\n 请选择楼梯左下角点:"))
(setq ww (getdist pa "\n 请输入楼梯总宽度w:"))
(setq hh (getdist pa "\n 请输入楼梯总高度h:"))
(setq n (getint "\n 请输入楼梯阶数(整数):"))
;选择楼梯方向
;(initget "L l R r");;;指定输入范围
(setq side (getstring "\n 请输入楼梯方向:(左/L)(右/R)"))
(setq side (strcase side));;全变成大写
(cond
((= side "L") (setq ldirect pi))
((= side "R") (setq ldirect 0))
)
;画出楼梯右下角墙壁线
(setq pb (polar pa ldirect ww))
(setq pc (polar pb (* pi 0.5) hh))
(command "pLINE" "_non" pa "_non" pb "_non" pc "")
;;赋值
(setq lw (/ ww n))
(setq lh (/ hh n))
(princ "\n 一阶楼梯宽") (princ lw)
(princ "\n 一阶楼梯高") (princ lh)
;;进入循环前的准备
(setq p1 pa)
(command "PLINE") ;;;;进入循环前先执行多段线命令,可将楼梯变为多段线
;;进入循环
(repeat n
(setq p2 (polar p1 (* pi 0.5) lh))
(setq p3 (polar p2 ldirect lw))
(command"_non" p1 "_non" p2 "_non" p3)
(setq p1 p3)
)
(command "")
(princ "\n 画楼梯任务完成")
(prin1)
)
(prompt "\n 画楼梯程序(可选择楼梯方向),命令:tt")
(prin1) 本帖最后由 Marckie 于 2018-10-29 16:09 编辑
各位,问了群里大佬,原来要把捕捉给关掉 (setvar "osmode" 0);关闭捕捉
嗯,调用CAD命令绘图一定要先关闭捕捉
页:
[1]