明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 529|回复: 11

[提问] 图层名列表中的元素排序问题,请各位赐教!

[复制链接]
发表于 2024-9-22 10:08:17 | 显示全部楼层 |阅读模式
列表中的元素排序问题: DWG图中有图层名有如下 "DIE_1_PW" "DIE_2_PW""DIE_PW" "PH_1_PW"  "PH_PW" "PS_1_PW" "PS_2_PW"  "PS_PW",怎么写个程序自动获取图层名列表的排序为:"DIE_PW" "DIE_1_PW" "DIE_2_PW" "PS_1_PW" "PS_2_PW" "PS_PW"  "PH_PW" "PH_1_PW"
发表于 3 小时前 | 显示全部楼层
  1. (setq lst '("PS_2_PW"         "DDD-1"      "DIE_1_PW"   "PS_PW"
  2.             "PH_PW"         "DIE_PW"     "PH_1_PW"           "DIE_2_PW"
  3.             "DDD-34"         "PS_1_PW"
  4.            )
  5. )
  6. (setq lst< '("DIE" "PS" "PH"))
  7. (foreach abc lst
  8.   (or (vl-position
  9.         t
  10.         (mapcar
  11.           '(lambda (x) (wcmatch abc (strcat x "*")))
  12.           lst<
  13.         )
  14.       )
  15.       (setq lst2 (cons abc lst2))
  16.   )
  17. )
  18. (append
  19.   (apply
  20.     'append
  21.     (mapcar
  22.       '(lambda (a / l)
  23.          (if (setq l (vl-remove-if-not
  24.                        '(lambda (b) (wcmatch b (strcat a "*")))
  25.                        lst
  26.                      )
  27.              )
  28.            (vl-sort l
  29.                     '(lambda (c d / an)
  30.                        (setq an (+ (strlen a) 2))
  31.                        (< (atoi (substr c an 1)) (atoi (substr d an 1)))
  32.                      )
  33.            )
  34.          )
  35.        )
  36.       lst<
  37.     )
  38.   )
  39.   (reverse lst2)
  40. )
回复 支持 反对

使用道具 举报

发表于 2024-9-26 07:58:49 | 显示全部楼层
(setq lst '("PS_2_PW" "DIE_1_PW" "PS_PW" "PH_PW" "DIE_PW" "PH_1_PW" "DIE_2_PW" "PS_1_PW"))
(setq lst< '("DIE" "PS" "PH"))

(apply
  'append
  (mapcar
    '(lambda(a / l)
       (if(setq l(vl-remove-if-not '(lambda(b)(wcmatch b(strcat a "*")))lst))
         (vl-sort l
           '(lambda(c d / an)
              (setq an(+(strlen a)2))
              (<(atoi(substr c an 1))(atoi(substr d an 1)))
            )
         )
       )
     )
    lst<
  )
)
发表于 2024-9-22 21:51:24 | 显示全部楼层
针对你所讲的这种情况和规律。


  1. (setq lst '("DIE_1_PW" "DIE_2_PW" "DIE_PW" "PH_1_PW"  "PH_PW" "PS_1_PW" "PS_2_PW"  "PS_PW"))
  2. (setq lst0 (mapcar '(lambda (x)
  3.         (if (not (wcmatch x "*_[0-9]_*"))
  4.                 (progn
  5.                         (setq p (vl-string-position (ascii "_") x))
  6.                         (strcat (substr x 1 p) "_0_" (substr x (+ 2 p)))
  7.                 )
  8.                 x
  9.         ))
  10.         lst
  11. ))

  12. (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst0 '<))
发表于 2024-9-22 20:34:06 | 显示全部楼层
"DIE_PW" "DIE_1_PW" "DIE_2_PW"
"PS_1_PW" "PS_2_PW" "PS_PW"  
"PH_PW" "PH_1_PW"

还有更多图层吗?

若只此好办...
发表于 2024-9-22 22:12:29 | 显示全部楼层

Command: (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst0 '<))
("DIE_PW" "DIE_1_PW" "DIE_2_PW" "PH_PW" "PH_1_PW" "PS_PW" "PS_1_PW" "PS_2_PW")

察觉与诉求的排列不合
发表于 2024-9-23 10:10:01 | 显示全部楼层
如果图名名称都是死的,何必读取排序,直接按照自己需要的顺序定义一个变量就行了。
 楼主| 发表于 2024-9-24 20:50:26 | 显示全部楼层
Bao_lai 发表于 2024-9-22 21:51
针对你所讲的这种情况和规律。

感谢回应,试后的结果还差点,ph开头的图层名能不能给我排到PS开的图层名后面去吧,("DIE_PW" "DIE_1_PW" "DIE_2_PW" "PS_1_PW" "PS_2_PW" "PS_PW"  "PH_PW" "PH_1_PW" )
发表于 2024-9-24 22:13:01 | 显示全部楼层
caoyongjun 发表于 2024-9-24 20:50
感谢回应,试后的结果还差点,ph开头的图层名能不能给我排到PS开的图层名后面去吧,("DIE_PW" "DIE_1_PW ...

感觉你这个没有很大的规律,如果图层不多,建议按楼上,定义一变量表,按这个变量表来排序。
或者你再扩大一些数据或者说明,大家帮你找一下规律和方法。
 楼主| 发表于 2024-9-25 20:27:29 | 显示全部楼层
Bao_lai 发表于 2024-9-24 22:13
感觉你这个没有很大的规律,如果图层不多,建议按楼上,定义一变量表,按这个变量表来排序。
或者你再扩 ...

现在只要把ph开头的图层名排在PS开头的图层名后面就行了。
 楼主| 发表于 2024-9-26 11:46:31 | 显示全部楼层
xtjd 发表于 2024-9-26 07:58
(setq lst '("PS_2_PW" "DIE_1_PW" "PS_PW" "PH_PW" "DIE_PW" "PH_1_PW" "DIE_2_PW" "PS_1_PW"))
(setq ls ...

非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-20 23:35 , Processed in 0.190904 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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