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