乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 35|回复: 3

[编程交流] [LISP]多级排序

[复制链接]

6

主题

11

帖子

5

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 08:50:38 | 显示全部楼层 |阅读模式
你好
 
我有以下功能:
  1. (defun zk:LST_SS->List (sel / % l)
  2. (repeat
  3.         (setq % (sslength sel))
  4.         (setq % (1- %)
  5.                   l (cons (ssname sel %) l)
  6.         )
  7. )
  8. )

 
  1. (defun zk:SortLstXYEnt->Lst (lstEnt mode / lstPkt lstMode lstOut lstSgn)
  2. (cond
  3.         ((= mode "-Y(X)")  (setq lstMode (list cadadr caadr) lstSgn (list > <)))
  4.         ((= mode "-Y(-X)") (setq lstMode (list cadadr caadr) lstSgn (list > >)))
  5.         ((= mode "Y(X)")   (setq lstMode (list cadadr caadr) lstSgn (list < <)))
  6.         ((= mode "Y(-X)")  (setq lstMode (list cadadr caadr) lstSgn (list < >)))
  7.         ((= mode "X(Y)")   (setq lstMode (list caadr cadadr) lstSgn (list < <)))
  8.         ((= mode "X(-Y)")  (setq lstMode (list caadr cadadr) lstSgn (list < >)))
  9.         ((= mode "-X(Y)")  (setq lstMode (list caadr cadadr) lstSgn (list > <)))
  10.         ((= mode "-X(-Y)") (setq lstMode (list caadr cadadr) lstSgn (list > >)))
  11. )
  12. (foreach ent lstEnt (setq lstPkt (cons (cons ent (list (cdr(assoc 10 (entget ent))))) lstPkt)))                       
  13. (setq lstPkt (zk:SortFunction lstPkt > lstMode))
  14. )

 
  1. ;;---------------------------------=={ zk:SortFunction }==---------------------------------;;
  2. ;; multi-level sorting                                                         ;;
  3. ;;-----------------------------------------------------------------------------------------;;
  4. ;; Lst [LST]  - list np. ((<entity name> '(10 20 0)) (<entity name> '(20 30 0)))...       ;;
  5. ;; Sgn [+/-]  - sort direction indicator                                               ;;
  6. ;; Col [LST]  - list of columns, after which they followed another sort                ;;
  7. ;;-----------------------------------------------------------------------------------------;;
  8. ;; ex. Col: (list caadr cadadr)                                                            ;;
  9. ;;-----------------------------------------------------------------------------------------;;
  10. (defun zk:SortFunction (Lst Sgn Col)
  11. (member Sgn (list < >))
  12. (mapcar
  13.         '(lambda (%)
  14.                 (setq Lst
  15.                         (vl-sort Lst
  16.                                 (function
  17.                                         (lambda (e1 e2)
  18.                                                 (Sgn
  19.                                                         ((eval %) e1)
  20.                                                         ((eval %) e2)
  21.                                                 )
  22.                                         )
  23.                                 )
  24.                         )
  25.                 )
  26.         )
  27.         Col
  28. )
  29. Lst
  30. )

 
运行:
  1. (setq ssGroup (ssget (list (cons 0 "TEXT"))))
  2. (zk:LST_SS->List ssGroup)

 
现在我想更改“zk:SortFunction”,以便根据列表ex进行排序:
(setq lstSgn(列表>>))
附件中是所有组合。现在我只有第八名的4名;签署“>”或“
 
有人能帮我吗?
打招呼
分类图纸
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:14:21 | 显示全部楼层
你的代码中有一些奇怪的地方,例如,你的排序函数只返回列表中的最后一项——或者至少我是这么理解的。
 
无论如何,你所附的图纸与示例文本有轻微的偏差。E、 g.第一组(-Y+X)“1”的Y插入值为3368.7494,但“同一”线上的“3”的Y为3368.7503。因此,“3”将排序在“1”之前,因为它“更高”-甚至仅按0.0009排序。
 
因此,我建议添加一个模糊因素:
注意,此功能可能会变得更简单和/或更有效。但它显示了总体思路。下面是我用来测试它的代码:
  1. (defun c:TestXYSort (/ ss order fuzz lst)
  2. (if (and (setq ss (ssget (list (cons 0 "TEXT"))))
  3.           (progn
  4.             (initget "XY X-Y -XY -X-Y YX Y-X -YX -Y-X")
  5.             (setq order (getkword "Select order [XY/X-Y/-XY/-X-Y/YX/Y-X/-YX/-Y-X]: "))
  6.           )
  7.           (or (setq fuzz (getreal "Fuzz factor <1.0>: "))
  8.               (setq fuzz 1.)
  9.           )
  10.      )
  11.    (progn
  12.      (setq lst (zk:LST_SS->List ss))
  13.      (setq lst (sort-XY lst (read order) fuzz))
  14.      (prin1 (mapcar '(lambda (item) (cdr (assoc 1 (entget item)))) lst))
  15.    )
  16. )
  17. (princ)
  18. )
回复

使用道具 举报

6

主题

11

帖子

5

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 09:31:33 | 显示全部楼层
嗨,irneb,
 
谢谢你的帮助和一个例子
我检查了一下,发现了两个错误(查看dwg.file-红色“NO OKEY”)。
 
打招呼
图纸4.dwg
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:56:24 | 显示全部楼层
好的,再试一次。我使用了一个更字面的比较,而不是依赖or。使comp的参数更符合顺序-更具可读性。并改为使用car和cdr而不是nth。通过将entget移到排序比较之外,并使用索引排序列表从原始列表中检索,也提高了效率。还将所有内部defuns合并为一个:
我还注意到,您最初的排序中有一些项目。x/y关闭超过1.0的dwg。因此,我更新了测试函数,改为使用10.0的模糊距离。还添加了一个测试,以查看根据文本值排序是否正确。
  1. 7
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 08:03 , Processed in 0.321658 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表