找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 867|回复: 5

[LISP程序]:请帮忙指点我的程序错误(急!!在线等待)

[复制链接]
发表于 2004-6-10 09:21:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我编的程序是在选择的边界内部间隔10米的点画。思想是在选择边界后再拾取一内部点,在内部点的基础上用一个二重循环把X和Y坐标累加累减得到点,其中,用一个网友提供的测试点在边界内部的函数来控制循环的终止(在此感谢网友们的无私奉献)。我的程序不能运行使用。我不知道错误出在那里。请帮忙看看问题所在!!(急!!在线等待)
   

  1. (defun c:tc()


  2. (defun zn (/                plendpt           x_lst   e                 op
  3.              n                fst_pt           int_num    online         pc
  4.              pn                min_num           edge_int_num                 pt_online_num
  5.              op1 )
  6.   (setq min_num 0.0001)
  7.   (princ "\n选择边界:")
  8.   (while (not e) (setq e (car (entsel))))
  9.   (if (= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
  10.     (progn
  11.       (redraw e 3)
  12.       (while (not op) (setq op (getpoint "\n请拾取边界内部点:")))
  13.       (foreach n (entget e)
  14.         (if (= 10 (car n))
  15.           (if plendpt
  16.             (setq plendpt (append plendpt (list (cdr n))))
  17.             (setq plendpt (list (cdr n)))
  18.           )
  19.         )
  20.       )
  21.       (setq X_lst (mapcar '(lambda (x) (car x)) plendpt))
  22.       (setq delta_X (abs (- (apply 'max x_lst) (car op))))
  23.       (setq plendpt          (append plendpt (list (nth 0 plendpt)))
  24.             edge_int_num  0
  25.             pt_online_num 0
  26.       )
  27.       (while (> (length plendpt) 1)
  28.         (setq pc (nth 0 plendpt)
  29.               pn (nth 1 plendpt)
  30.         )
  31.         (setq op1 (polar op 0 (* delta_x 2)))
  32.         (if (inters op
  33.                     op1
  34.                     pc
  35.                     pn
  36.             )

  37.           (setq edge_int_num (+ 1 edge_int_num))
  38.         )
  39.         (if (equal (+ (distance op pc) (distance pc op1))
  40.                    (distance op op1)
  41.                    min_num)
  42.           (setq pt_online_num (+ 1 pt_online_num))
  43.         )

  44.         (if (equal (+ (distance op pc) (distance op pn))
  45.                    (distance pc pn)
  46.                    min_num
  47.             )
  48.           (setq online "t")
  49.         )
  50.         (setq plendpt (cdr plendpt))
  51.       )
  52.       (redraw e 4)
  53.      
  54.       )
  55.     )
  56.   )
  57.   (setq x (car p0))
  58.   (setq y (cadr p0))
  59.   (zn)
  60.     (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  61.          (zn)
  62.          (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  63.          (command "circle" p0 1 "" )
  64.          (setq x (+ x 10))         
  65.          (setq p0 (list x y))
  66.                   )

  67.    (setq y (+ y 10))         
  68.    (setq p0 (list x y))
  69.   (command "circle" p0 1 "" )
  70.       )
  71.    (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  72.          (zn)
  73.          (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  74.          (command "circle" p0 1 "" )
  75.          (setq x (+ x 10))         
  76.          (setq p0 (list x y))
  77.                   )

  78.    (setq y (- y 10))         
  79.    (setq p0 (list x y))
  80.   (command "circle" p0 1 "" )
  81.         )
  82.   (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  83.          (zn)
  84.          (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  85.          (command "circle" p0 1 "" )
  86.          (setq x (- x 10))         
  87.          (setq p0 (list x y))
  88.                   )

  89.    (setq y (+ y 10))         
  90.    (setq p0 (list x y))
  91.    (command "circle" p0 1 "" )
  92.    )
  93.   (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  94.          (zn)
  95.          (while (= (rem (+ pt_online_num edge_int_num) 2) 1)
  96.          (command "circle" p0 1 "" )
  97.          (setq x (- x 10))         
  98.          (setq p0 (list x y))
  99.                   )

  100.    (setq y (- y 10))         
  101.    (setq p0 (list x y))
  102.    (command "circle" p0 1 "" )
  103.    )
  104. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-6-10 10:32:58 | 显示全部楼层
跟踪运行发现:
(while (= (rem (+ pt_online_num edge_int_num) 2) 1)
这一句有问题。
你好好检查一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-10 10:42:50 | 显示全部楼层
函数ZN那段代码看起来很熟悉呀,呵呵。

你的程序中的问题
3  这是一个没有出口的循环
[PHP](while (= (rem (+ pt_online_num edge_int_num) 2) 1)
(command "circle" p0 1 "" )
(setq x (+ x 10))
(setq p0 (list x y))
)
[/PHP]

2  zn函数中 pt_online_num  edge_int_num online 是局部变量

1  p0是NIL,应该替换为op


下面只有x+方向的,其他可以参照这个写。
[PHP]
(defun c:tc (/               plendpt         x_lst           e             op
             n               fst_pt         int_num   online    pc
             pn               min_num         edge_int_num             pt_online_num
             op1
            )
  (defun zn ()
    (setq min_num 0.0001)
    (princ "\n选择边界:")
    (while (not e) (setq e (car (entsel))))
    (if        (= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
      (progn
        (redraw e 3)
        (while (not op) (setq op (getpoint "\n请拾取边界内部点:")))
        (foreach n (entget e)
          (if (= 10 (car n))
            (if        plendpt
              (setq plendpt (append plendpt (list (cdr n))))
              (setq plendpt (list (cdr n)))
            )
          )
        )
        (setq X_lst (mapcar '(lambda (x) (car x)) plendpt))
        (setq delta_X (abs (- (apply 'max x_lst) (car op))))
        (setq plendpt            (append plendpt (list (nth 0 plendpt)))
              edge_int_num  0
              pt_online_num 0
              online            nil
        )
        (while (> (length plendpt) 1)
          (setq        pc (nth 0 plendpt)
                pn (nth 1 plendpt)
          )
          (setq op1 (polar op 0 (* delta_x 2)))
          (if (inters op
                      op1
                      pc
                      pn
              )

            (setq edge_int_num (+ 1 edge_int_num))
          )
          (if (equal (+ (distance op pc) (distance pc op1))
                     (distance op op1)
                     min_num
              )
            (setq pt_online_num (+ 1 pt_online_num))
          )

          (if (equal (+ (distance op pc) (distance op pn))
                     (distance pc pn)
                     min_num
              )
            (setq online "t")
          )
          (setq plendpt (cdr plendpt))
        )
        (redraw e 4)
      )
    )
  )

  (zn)
  (setq x (car op))
  (setq y (cadr op))
  (while (and (= (rem (+ pt_online_num edge_int_num) 2) 1)
              (not online)
         )
    (command "circle" op 1 "")
    (setq x (+ x 20))
    (setq op (list x y))
    (zn)
  )
)
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-10 10:52:24 | 显示全部楼层
我是一个新手,好多东西都不懂。
请帮我改正,好吗?不盛感激!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-10 11:10:52 | 显示全部楼层
试试看,我用没问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-11 11:44:56 | 显示全部楼层
还有一个问题,为什么画的圆出了边界啊。该怎样改进呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 05:31 , Processed in 0.172958 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表