排序
;排序(Defun PPP_xy(9bss_List XY s3 m)
(Setq Px_bss_List '())
(Setq Nx_bss_List '())
(if
(And 9bss_List (= XY 1))
(Progn
(While
9bss_List
(Setq Bi (Rtos(Caar(Car 9bss_List))2 m))
(Setq Bi_List '())
(Setq n 0)
(While
(And 9bss_List (Nth n 9bss_List))
(if
(=(Rtos(Caar(Nth n 9bss_List))2 m)Bi)
(Progn
(Setq Bi_List (Append Bi_List (List(Nth n 9bss_List))))
(Setq 9bss_List (vl-remove (Nth n 9bss_List)9bss_List))
)
(Setq n (1+ n))
)
)
(if
Bi_List
(Setq Px_bss_List (Append Px_bss_List (List(List(Atof Bi)Bi_List))))
)
)
(Cond
((= s3 "0")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (< (Car e1) (Car e2))))));左到右排一下
)
((= s3 "1")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (> (Car e1) (Car e2))))));右到左排一下
)
((= s3 "2")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (< (Car e1) (Car e2))))));左到右排一下
)
((= s3 "3")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (> (Car e1) (Car e2))))));右到左排一下
)
)
(Setq n 0)
(While
(Nth n Px_bss_List)
(Setq LL_List (Cadr(Nth n Px_bss_List)))
(Cond
((= s3 "0")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (> (Cadr(Car e1)) (Cadr(Car e2)))))));上到下排一下
)
((= s3 "1")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (> (Cadr(Car e1)) (Cadr(Car e2)))))));上到下排一下
)
((= s3 "2")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (< (Cadr(Car e1)) (Cadr(Car e2)))))));下到上排一下
)
((= s3 "3")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (< (Cadr(Car e1)) (Cadr(Car e2)))))));下到上排一下
)
)
(Setq Nx_bss_List (Append Nx_bss_List LL_List))
(Setq n (1+ n))
)
)
)
(if
(And 9bss_List (= XY 2))
(Progn
(While
9bss_List
(Setq Bi (Rtos(Cadr(Car(Car 9bss_List)))2 m))
(Setq Bi_List '())
(Setq n 0)
(While
(And 9bss_List (Nth n 9bss_List))
(if
(=(Rtos(Cadr(Car(Nth n 9bss_List)))2 m)Bi)
(Progn
(Setq Bi_List (Append Bi_List (List(Nth n 9bss_List))))
(Setq 9bss_List (vl-remove (Nth n 9bss_List)9bss_List))
)
(Setq n (1+ n))
)
)
(if
Bi_List
(Setq Px_bss_List (Append Px_bss_List (List(List(Atof Bi)Bi_List))))
)
)
(Cond
((= s3 "4")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (< (Car e1) (Car e2))))));上到下排一下
)
((= s3 "5")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (> (Car e1) (Car e2))))));下到上排一下
)
((= s3 "6")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (< (Car e1) (Car e2))))));上到下排一下
)
((= s3 "7")
(Setq Px_bss_List (vl-sort Px_bss_List (function (lambda (e1 e2) (> (Car e1) (Car e2))))));下到上排一下
)
)
(Setq n 0)
(While
(Nth n Px_bss_List)
(Setq LL_List (Cadr(Nth n Px_bss_List)))
(Cond
((= s3 "4")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (< (Car(Car e1)) (Car(Car e2)))))));左到右排一下
)
((= s3 "5")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (< (Car(Car e1)) (Car(Car e2)))))));左到右排一下
)
((= s3 "6")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (> (Car(Car e1)) (Car(Car e2)))))));右到左排一下
)
((= s3 "7")
(Setq LL_List (vl-sort LL_List (function (lambda (e1 e2) (> (Car(Car e1)) (Car(Car e2)))))));右到左排一下
)
)
(Setq Nx_bss_List (Append Nx_bss_List LL_List))
(Setq n (1+ n))
)
)
)
Nx_bss_List
)
感谢分享,这个咋用,能不能给一个样例, Bao_lai 发表于 2025-8-15 12:32
感谢分享,这个咋用,能不能给一个样例,
运行试试看 感谢分享,排序在工作中还是经常用到的
;数据格式:
;输入数据是一个包含坐标信息的列表,每个元素格式为 ((x坐标 y坐标) 附加信息),例如 ((100.0 250.0) "点A") 表示一个 X=100、Y=250 的点,附加信息为 "点 A"。
;参数含义:
;第 1 个参数:要排序的点列表(使用 copy-list 避免修改原始列表)
;第 2 个参数 XY:排序基准(1 = 按 X 坐标,2 = 按 Y 坐标)
;第 3 个参数 s3:排序方向("0"-"7" 对应不同的排序规则组合)
;第 4 个参数 m:坐标值保留的小数位数
;预期输出:
;运行后会在命令行显示 4 种不同排序方式的结果,例如:
;示例 1 会先按 X 从小到大排序,X 相同时按 Y 从大到小排序
;示例 3 会先按 Y 从小到大排序,Y 相同时按 X 从小到大排序
; 示例数据: 包含坐标信息的列表
; 格式为: ((x坐标 y坐标) 其他信息)
(setq points '(
((100.0 250.0) "点A"); (x=100, y=250)
((150.0 200.0) "点B"); (x=150, y=200)
((100.0 300.0) "点C"); (x=100, y=300)
((200.0 150.0) "点D"); (x=200, y=150)
((150.0 250.0) "点E"); (x=150, y=250)
((100.0 200.0) "点F"); (x=100, y=200)
((200.0 200.0) "点G"); (x=200, y=200)
))
;(((100.0 250.0) "点A") ((150.0 200.0) "点B") ((100.0 300.0) "点C") ((200.0 150.0) "点D") ((150.0 250.0) "点E") ((100.0 200.0) "点F") ((200.0 200.0) "点G"))
; 示例1: 按X坐标升序(x从小到大),相同X则按Y坐标降序(y从大到小)
; 参数说明: XY=1(按X排序), s3="0"(X升序,Y降序), m=1(保留1位小数)
(setq result1 (ppp_xy points 1 "0" 1))
;(((100.0 300.0) "点C") ((100.0 250.0) "点A") ((100.0 200.0) "点F") ((150.0 250.0) "点E") ((150.0 200.0) "点B") ((200.0 200.0) "点G") ((200.0 150.0) "点D"))
; 示例2: 按X坐标降序(x从大到小),相同X则按Y坐标升序(y从小到大)
(setq result2 (ppp_xy points 1 "2" 1))
;(((100.0 200.0) "点F") ((100.0 250.0) "点A") ((100.0 300.0) "点C") ((150.0 200.0) "点B") ((150.0 250.0) "点E") ((200.0 150.0) "点D") ((200.0 200.0) "点G"))
; 示例3: 按Y坐标升序(y从小到大),相同Y则按X坐标升序(x从小到大)
(setq result3 (ppp_xy points 2 "4" 1))
;(((200.0 150.0) "点D") ((100.0 200.0) "点F") ((150.0 200.0) "点B") ((200.0 200.0) "点G") ((100.0 250.0) "点A") ((150.0 250.0) "点E") ((100.0 300.0) "点C"))
; 示例4: 按Y坐标降序(y从大到小),相同Y则按X坐标降序(x从大到小)
(setq result4 (ppp_xy points 2 "7" 1))
;(((100.0 300.0) "点C") ((150.0 250.0) "点E") ((100.0 250.0) "点A") ((200.0 200.0) "点G") ((150.0 200.0) "点B") ((100.0 200.0) "点F") ((200.0 150.0) "点D"))
页:
[1]