明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2846|回复: 6

按指定字母顺序排列

[复制链接]
发表于 2012-7-11 20:28:36 | 显示全部楼层 |阅读模式
按指定字母顺序排列:
比如如下图片中:按指定字母顺序T,P,F排序,只取首字母即可,不知道有没有高手写过这样的代码,能否指导一下!

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

  • · 收集|主题: 58, 订阅: 4
 楼主| 发表于 2012-7-11 20:34:05 | 显示全部楼层
本帖最后由 xyz2009xyz 于 2012-7-11 20:37 编辑

上面的是按照A-Z字母序排列的,采用的ZML大虾排序函数:按组码内容排序的
;;;===================================================================================================
;; 通用函数 选择集按照给定的组码值进行排序
;;程序来自网络,版权归作者zml84所有
;|参数说明:  
              SE  ----要排序的选择集                                                                  
              DXF ----排序依据的组码号                                                                 
              INT ----如果组码值为一个表,则INT指出使用第几个;否则nil                                 
              FUZZ----允许偏差;若无为nil                                                              
              K   ----T表示从大到小,nil表示从小到大                                                   
    返回值:排序后的选择集                                                                             
    示例:(SORT-SE SS 10 0   5.0 T  )  表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小
          (SORT-SE SS 10 1   3.0 NIL)  表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大
          (SORT-SE SS 8  NIL NIL NIL)  表示按照8组码值(图层名称)进行排序,顺序为从小到大            
|;
;;;===================================================================================================
(defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
    (vl-load-com)
    ;;建立排序列表
    (setq LST '()
   INDEX 0
    )
    (repeat (sslength SE)
(setq ENT (entget (ssname SE INDEX))
       TMP (cdr (assoc DXF ENT))
)
(if (and INT
   (= (type INT) 'INT)
   (= (type TMP) 'list)
   (< INT (length TMP))
     )
     (setq TMP (nth INT TMP))
)
(setq LST (cons
        (list TMP (cdr (assoc 5 ENT)))
        LST
    )
)
(setq INDEX (1+ INDEX))
    )
    ;;排序操作
    (if (and FUZZ
      (or
   (= (type FUZZ) 'INT)
   (= (type FUZZ) 'REAL)
      )
      (or
   (= (type TMP) 'INT)
   (= (type TMP) 'REAL)
      )
)
(setq NEWLST
   (vl-sort LST
     (function (lambda (E1 E2)
     (< (+ (car E1) FUZZ) (car E2))
        )
     )
   )
)
(setq NEWLST
   (vl-sort LST
     (function (lambda (E1 E2)
     (< (car E1) (car E2))
        )
     )
   )
)
    )
    ;;如果K为T,则倒置
    (if K
(setq NEWLST (reverse NEWLST))
    )
    ;;组织排序后的选择集
    (setq NEWSE (ssadd))
    (foreach TMP NEWLST
(setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
    )
    ;;返回值
    NEWSE
) ;_结束defun

能否修改成“按组码内容+如果设定按指定字母排序则取首字母排序两种组合,没有指定则按组码内容排序”?
发表于 2012-7-11 22:11:21 | 显示全部楼层

  1. ;; 文本排序变色
  2. (defun c:tt ()
  3.   (setq ss  (ssget '((0 . "TEXT") (1 . "T*,P*,F*")))
  4.            lst '()
  5.            i   -1
  6.   )
  7.   (while (setq s1 (ssname ss (setq i (1+ i))))
  8.     (setq lst (cons s1 lst))
  9.   )
  10.   (setq lst (vl-sort lst
  11.                '(lambda (x y)
  12.          (< (vla-get-textstring (vlax-ename->vla-object x))
  13.                          (vla-get-textstring (vlax-ename->vla-object y))
  14.                   )))
  15.         i   1
  16.   )
  17.   (foreach a lst
  18.     (vla-put-color (vlax-ename->vla-object a) i)
  19.     (setq i (1+ i))
  20.   )
  21.   (princ)
  22. )

点评

院长我测试为什么并没有排序,只是改变了一下颜色,CAD2004  发表于 2012-7-12 16:18
发表于 2012-7-12 09:15:22 | 显示全部楼层
xyp1964 发表于 2012-7-11 22:11

谢谢斑竹的分享!
下载收藏学习学习。
谢谢!
发表于 2012-7-12 09:58:43 | 显示全部楼层
牛人很多啊
 楼主| 发表于 2012-7-12 16:24:18 | 显示全部楼层
xyp1964 发表于 2012-7-11 22:11

可能是我表述不清楚:要实现排序效果如下图附件示例

本帖子中包含更多资源

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

x

点评

参数不全  发表于 2012-7-12 21:34
 楼主| 发表于 2012-9-11 08:20:53 | 显示全部楼层
再顶一下,有没有高手!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-30 12:34 , Processed in 0.207967 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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