明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2025|回复: 4

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

[复制链接]
发表于 2012-4-11 12:43 | 显示全部楼层 |阅读模式
本帖最后由 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)))
  )
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-4-11 13:52 | 显示全部楼层
仅仅大概扫了一眼。
NTH的首个元素序列号是0,不是1
所以改 (setq index 1)为 (setq index 0)
REPEAT的数量应该为N,不是N-1
 楼主| 发表于 2012-4-11 14:55 | 显示全部楼层
mmmmmm 发表于 2012-4-11 13:52
仅仅大概扫了一眼。
NTH的首个元素序列号是0,不是1
所以改 (setq index 1)为 (setq index 0)

哈哈 真是 低级错误 谢谢!
发表于 2012-4-12 19:30 来自手机 | 显示全部楼层
大量使用repeat不好
 楼主| 发表于 2012-4-14 23:43 | 显示全部楼层
我连菜鸟都谈不上 所以写的代码很长 向大家学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-7-2 23:00 , Processed in 0.191019 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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