明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 494|回复: 4

[经验] 图层名列表中的元素排序问题,请各位看看

[复制链接]
发表于 2024-11-29 13:16:35 | 显示全部楼层 |阅读模式
本帖最后由 kun123321 于 2024-11-29 13:27 编辑

列表中的元素排序问题: 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" )

回复

使用道具 举报

发表于 2024-11-29 13:52:47 | 显示全部楼层
写啥处理代码,直接最后顺序列表返回就是
回复 支持 1 反对 0

使用道具 举报

发表于 2024-11-29 14:00:20 | 显示全部楼层
vl-positon排序,,,
回复 支持 反对

使用道具 举报

发表于 2024-11-29 19:11:19 | 显示全部楼层
看看我的帖子,是不是你要的结果?
http://bbs.mjtd.com/thread-191577-1-1.html
回复 支持 反对

使用道具 举报

发表于 2024-12-4 13:28:50 | 显示全部楼层
本帖最后由 llsheng_73 于 2024-12-4 13:47 编辑

N维表排序及自定义顺序
http://bbs.mjtd.com/forum.php?mo ... 6244&fromuid=202795
(出处: 明经CAD社区)
  1. (defun sortn(l funs)
  2.   (or(listp(car l))(setq l(mapcar'list l)))
  3.   (or(listp funs)(setq funs(list funs)))
  4.   (while(<(length funs)(length(car l)))
  5.     (setq funs(cons(car funs)funs)))
  6.   (vl-sort l'(lambda(x y / n)(setq n 0)
  7.        (while(and(=(car x)(car y))(cdr x)(cdr y))(setq x(cdr x)y(cdr y)n(1+ n)))((nth n funs)(car x)(car y)))))

(setq lst'("DIE_2_PW" "PH_1_PW" "PS_2_PW" "PH_PW" "DIE_1_PW" "DIE_PW" "PS_1_PW" "PS_PW"))
对它进行处理,以便后续排序
(setq l(mapcar'(lambda(x / l)(if(cddr(setq l(mapcar'(lambda(x)(if(VL-SYMBOLP x)(VL-SYMBOL-NAME x)x))(read(strcat"("(VL-STRING-TRANSLATE"_"" "x)")")))))
                                            l(list(car l)0(cadr l))))lst))
接下来对l进行排序并对应表原始数据表
(mapcar'(lambda(x)(nth(vl-position x l)lst))
       (sortn l(List < < <)))
("DIE_PW" "DIE_1_PW" "DIE_2_PW" "PH_PW" "PH_1_PW" "PS_PW" "PS_1_PW" "PS_2_PW")
也可以按其它方式排序,比如DIE,PS,PH进行降序,其它按升序
(mapcar'(lambda(x)(nth(vl-position x l)lst))
       (sortn l(List > < <)))
("PS_PW" "PS_1_PW" "PS_2_PW" "PH_PW" "PH_1_PW" "DIE_PW" "DIE_1_PW" "DIE_2_PW")
也可以使用帖子中最后一个,自定义序列排序,不过在这里意义不大,但可能实现比较自由的自定义序列
  1. (defun sortn(l keys funs fuzz / n mposition);;;keys关键字列号要么为nil要么为表,funs各个关键字的排序方式,通常为<或>,也可以为自定义序列,比如'("张三""李四")
  2.   (defun mposition(e l / i)(if(setq i(vl-position e l))i(length l)))
  3.   (or(listp(car l))(setq l(mapcar'list l)))
  4.   (or(listp funs)(setq funs(list funs)))
  5.   (if(zerop(setq n(length keys)))(setq n(length(car l))))
  6.   (while(<(length funs)n)(setq funs(cons(car funs)funs)))
  7.   (mapcar(function(lambda(x)(nth x l)))
  8.          (vl-sort-i(if keys(mapcar(function(lambda(x)(mapcar'(lambda(y)(nth y x))keys)))l)l)
  9.                    (function(lambda(x y / n )(setq n 0)
  10.                       (while(and(equal(car x)(car y)fuzz)(cdr x)(cdr y))(setq x(cdr x)y(cdr y)n(1+ n)))
  11.                               (if(listp(setq n(nth n funs)))
  12.                                 (<(mposition(car x)n)(mposition(car y)n))
  13.                                 (n(car x)(car y))))))))

(mapcar'(lambda(x)(nth(vl-position x l)lst))
       (SORTN l NIL '(("PS""DIE""PH")(0 1 2))0))
("PS_PW" "PS_1_PW" "PS_2_PW" "DIE_PW" "DIE_1_PW" "DIE_2_PW" "PH_PW" "PH_1_PW")
(mapcar'(lambda(x)(nth(vl-position x l)lst))
       (SORTN l '(0 1) '(("PS""DIE""PH")(1 0 2))0))
("PS_1_PW" "PS_PW" "PS_2_PW" "DIE_1_PW" "DIE_PW" "DIE_2_PW" "PH_1_PW" "PH_PW")

(mapcar'(lambda(x)(nth(vl-position x l)lst))
       (SORTN l '(1 0) '((1 0 2)("PS""DIE""PH"))0))
("PS_1_PW" "DIE_1_PW" "PH_1_PW" "PS_PW" "DIE_PW" "PH_PW" "PS_2_PW" "DIE_2_PW")

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-23 00:51 , Processed in 0.183051 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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