zhuquanmao 发表于 2012-4-11 12:43:13

■属性值提取、排序 结果中少了一个属性值 求助!■

本帖最后由 zhuquanmao 于 2012-4-11 12:45 编辑

我把自己的代码和网上收集到的代码组合了下,想点选某个属性块里的属性值,得到属性标记及属性块名,然后再选择图中的属性块,再提取属性值,对属性值进行整理排序(去掉重复的属性值)
但得到的结果是 少了一个最小值的属性值
;;; 对属性值进行列表
(defun c:sxlb ( / cmd elist ename index jh lst n p qq rq ss test zhuty zity)
(setq cmd (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq zity (cdr (assoc 2 (entget (car (setq qq (nentsel "\n请选择一个属性块中的属性:")))))))
(setq zhuty (cdr (assoc 2 (entget (cdr (assoc 330 (entget (car qq))))))))
(princ "\n选择要列表的属性块:")
(setq ss (ssget))
(setq p '())
(setq n (sslength ss))
(setq index (- n 1))
(repeat n
    (setq ename (ssname ss index))
    (setq elist (entget ename))
    (if (and
          (= "INSERT" (cdr (assoc 0 elist)))
          (= zhuty (cdr (assoc 2 elist)))
        )
      (progn
        (setq elist ename
              test t
        )
        (while (and
               test
               (setq elist (entnext elist))
             )
          (setq lst (entget elist))
          (cond                     ;
          ((= zity (cdr (assoc 2 lst)))
              (progn
                (setq jh (cdr (assoc 1 lst)))
                (setq p (append
                          p
                          (list jh)
                        )
                )
              )
          )                             ;
          ((= "SEQEND" (cdr (assoc 0 lst)))
              (setq test nil)
          )
          )
        )                              ;
      )                 ;
    )

    (setq index (1- index))
)
(setq p (delsame p))
(setq p (vl-sort p '<))
(setq p (strsort p))
(setq n (vl-list-length p))
(setq index 1)
(repeat (- n 1)
    (princ (nth index p))
    (princ "\n")
    (setq index (1+ index))
)
(princ "\n")
(princ)
)


;以下为表排序程序
(defun strsort (strlst)
(defun strbrk (str / i st1 n)
    (setq i 0)
    (while (not (or
                  (= "" (setq st1 (substr str (setq i (1+ i)))))
                  (setq n (distof st1))
                )
           )
    )
    (list (substr str 1 (1- i)) (if n
                                  n
                                  0
                                ) str
    )
)
(defun x-sort (lst do n)
    (vl-sort lst '(lambda (x y)
                  ((eval do) (nth n x)
                     (nth n y)
                  )
                  )
    )
)
(mapcar
    'last
    (x-sort (x-sort (mapcar
                      'strbrk
                      strlst
                  ) '< 1
          ) '< 0
    )
)
)

;删除表中重复值
(defun delsame (l)
(if l
    (cons (car l) (delsame (vl-remove (car l) l)))
)
)

mmmmmm 发表于 2012-4-11 13:52:30

仅仅大概扫了一眼。
NTH的首个元素序列号是0,不是1
所以改 (setq index 1)为 (setq index 0)
REPEAT的数量应该为N,不是N-1

zhuquanmao 发表于 2012-4-11 14:55:14

mmmmmm 发表于 2012-4-11 13:52 static/image/common/back.gif
仅仅大概扫了一眼。
NTH的首个元素序列号是0,不是1
所以改 (setq index 1)为 (setq index 0)


哈哈 真是 低级错误 谢谢!

cabinsummer 发表于 2012-4-12 19:30:21

大量使用repeat不好

zhuquanmao 发表于 2012-4-14 23:43:19

我连菜鸟都谈不上 所以写的代码很长 向大家学习!
页: [1]
查看完整版本: ■属性值提取、排序 结果中少了一个属性值 求助!■