taylorzhang 发表于 2011-4-5 13:33:46

取多个对象的顶点并依次在命令行输出 程序只能输出最后对象的点 帮忙看看

(defun c:zxx(/ lst k i j ent qb lst dbf ss bcd aa)
    (setq ss (ssget))
    (setq sscd (sslength ss))
    (setq k -1 g -1 i -1 lst nil)
    (setq aa nil bb nil)
    (while (<(setq k (1+ k)) sscd);;取出选择集中的各个对象
         (setq en (ssname ss k))
   (setq aa (append (list en) aa));;把对象名称放到表中
    )
;;;    (princ aa) ;;用于编程测试用
;;;    (princ)
    (setq bcd (length aa))
    (while (< (setq g (1+ g)) bcd);;表中的对象名称依次求对象数据列表
    (setq ent(entget (nth g aa)))
;;;   (princ ent) ;;用于编程测试用
;;;       (princ)
          (setq encd (length ent))
;;;       (princ ent);;这句中的ent是随着循环变化的
          (princ)
       (while (<(setq i (1+ i))encd);;取出对象的顶点放到表lst中
          (setq qb (nth i ent))
          (if(=(car qb)10)
             (progn
               (setq dbf (list(cdr qb)))
               (setq lst (append dbf lst))
             )
          )         
       )
    (princ lst);;这句中的lst为什么老是最后一个对象的点呢?
    (princ)
    )
)

ZZXXQQ 发表于 2011-4-5 20:38:22

这句错了:
(setq aa (append (list en) aa))
应改成:
(setq aa (append aa (list en)))

taylorzhang 发表于 2011-4-5 21:43:56

本帖最后由 taylorzhang 于 2011-4-5 21:56 编辑

版主 我改了还是不行啊
(defun c:zxx(/ lst k i j ent qb lst dbf ss bcd aa)
    (setq ss (ssget))
    (setq sscd (sslength ss))
    (setq k -1 g -1 i -1 lst nil)
    (setq aa nil bb nil)
    (while (<(setq k (1+ k)) sscd);;取出选择集中的各个对象
         (setq en (ssname ss k))
   (setq aa (append aa (list en)));;把对象名称放到表中
    )
;;;    (princ aa) ;;用于编程测试用
;;;    (princ)
    (setq bcd (length aa))
    (while (< (setq g (1+ g)) bcd);;表中的对象名称依次求对象数据列表
    (setq ent(entget (nth g aa)))
;;;   (princ ent) ;;用于编程测试用
;;;       (princ)
          (setq encd (length ent))
;;;       (princ ent);;这句中的ent是随着循环变化的
          (princ)
       (while (<(setq i (1+ i))encd);;取出对象的顶点放到表lst中
          (setq qb (nth i ent))
          (if(=(car qb)10)
             (progn
               (setq dbf (list(cdr qb)))
               (setq lst (appendlst dbf))
             )
          )         
       )
    (princ lst);;这句中的lst为什么老是最后一个对象的点呢?
    (princ)
    )
)
选择对象:
(<图元名: 7ef94418> <图元名: 7ef94410>)((3178.6 658.258 0.0))((3178.6 658.258 0.0))

Gu_xl 发表于 2011-4-5 21:55:20

本帖最后由 Gu_xl 于 2011-4-5 21:56 编辑

回复 taylorzhang 的帖子


(defun c:zxx(/ lst k i j ent qb lst dbf ss bcd aa)
    (setq ss (ssget))
    (setq sscd (sslength ss))
    (setq k -1 g -1lst nil)
    (setq aa nil bb nil)
    (while (<(setq k (1+ k)) sscd);;取出选择集中的各个对象
         (setq en (ssname ss k))
   (setq aa (append (list en) aa ));;把对象名称放到表中
    )
;;;    (princ aa) ;;用于编程测试用
;;;    (princ)
    (setq bcd (length aa))
    (while (< (setq g (1+ g)) bcd);;表中的对象名称依次求对象数据列表
    (setq ent(entget (nth g aa)))
;;;   (princ ent) ;;用于编程测试用
;;;       (princ)
          (setq encd (length ent))
;;;       (princ ent);;这句中的ent是随着循环变化的
          (princ)
      (setq i -1) ;_ 重置i,问题在这里
       (while (<(setq i (1+ i))encd);;取出对象的顶点放到表lst中
          (setq qb (nth i ent))
          (if(=(car qb)10)
             (progn
               (setq dbf (list(cdr qb)))
               (setq lst (appendlst dbf))
             )
          )         
       )
    (princ)
    )
      (princ lst);;移除到最后打印
(princ)
)

taylorzhang 发表于 2011-4-5 21:59:11

谢谢 Gu_xl版主 ZZXXQQ 版主终于解决了

taylorzhang 发表于 2011-4-5 22:11:17

原来是对i没有重置 第二次循环时候第二个while 跳过了 呵呵
谢谢

tm20038175 发表于 2011-6-11 23:40:40

回复 Gu_xl 的帖子

此程序有点问题,当容差大于两点差时候,会少点,比如一共有二十点,容差为1时候,输出20个点,当容差变大时例如10,就输出12个点了,另外8个点在容差范围内的点,没有输出!!!!
页: [1]
查看完整版本: 取多个对象的顶点并依次在命令行输出 程序只能输出最后对象的点 帮忙看看