【@lisp函数库】list:group-by 按给定特征对表内元素分组。
本帖最后由 vitalgg 于 2023-4-24 09:28 编辑用法:
(list:group-by lst 'fun)
示例:
比如一组整数 lst = ( 1 3 5 1 4 5 3 8 2)
(setq lst '(1 3 5 1 4 5 3 8 2))
因为内部有相同的元素,我们无法使用 vl-sort 排序。所以使用 list:sort 进行无损排序
(setq lst (list:sort lst '<))
然后把相同的元素进行分组
(setq res (list:group-by lst '=))
比较函数 fun 的说明示例。
对于一个图元表 lst, 内容为 (ent1 ent2 ent3 ent4 ....entn)
如果我们要对它按特定特征分组。需要分两步进行。
1、按特征进行排序,比如 都是 单行文本 text 按 内容排序。
(setq lst (vl-sort lst '(lambda(x y) (< (entity:getdxf x 1)(entity:getdxf y 1)))))
2、按特征分组,fun 的意思是特征相同返回真,则分为一组。
(setq lst (list:group-by lst '(lambda(x y) (= (entity:getdxf x 1)(entity:getdxf y 1)))))
(defun list:group-by (lst fun / res g)
"对已排序的列表lst进行分组。fun为分组依据"
"lst"
"(list:group-by '(a a a b b c)
'(lambda(x y)(= x y)))
=> ((a a a)(b b)(c))"
(setq res nil)
(setq g (cons (car lst)
nil))
(while (setq lst (cdr lst))
(setq a% (car lst))
(if ((eval fun)
(car g)
a%)
(setq g (cons a% g))
(progn (setq res (cons (reverse g)
res))
(setq g (cons a% nil)))))
(if g (setq res (cons (reverse g)
res)))
(reverse res))
无须复制,在CAD内 安装 @lisp ,可以直接调用这个函数。
将以下代码复制到 CAD 命令行内,回车即可开始安装。
(在代码行里用鼠标连续三击全选,然后右键复制或Ctrl+C 。到CAD命令行内,右键粘贴或Ctrl+V)
(progn(vl-load-com)(setq s strcat h "http" o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://atlisp.""org/@"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))
关注 公众号,快速查看 @lisp 函数用法
想问一下楼主,这个支持中望不?用这个函数库写出来的lisp中望能用么?昨天搜索的时候发现了这个,发现是论坛上的大佬弄的,想来了解一下:lol hadessna 发表于 2023-6-8 10:58
想问一下楼主,这个支持中望不?用这个函数库写出来的lisp中望能用么?昨天搜索的时候发现了这个,发现是论 ...
中望2021以上支持自动配置,以前的版本的可能安装会有问题。需要手动配置。
配置好了是可以用的。 不错不错,很好的帖子:victory: 感谢张大,解决了图元分组的烦恼
页:
[1]