Marckie 发表于 2018-10-29 15:26:56

【求助】请问各位大神,这个画楼梯的程序画出来为什么不对劲?

本帖最后由 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)


请问各位大神为什么会出现上图中这种不规则阶梯的情况呢?求解答!!!!!

edata 发表于 2018-10-30 12:56:34

使用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 15:47:41

本帖最后由 Marckie 于 2018-10-29 16:09 编辑

各位,问了群里大佬,原来要把捕捉给关掉 (setvar "osmode" 0);关闭捕捉

GSD 发表于 2018-10-30 19:59:37

嗯,调用CAD命令绘图一定要先关闭捕捉
页: [1]
查看完整版本: 【求助】请问各位大神,这个画楼梯的程序画出来为什么不对劲?