多段线顶点过滤/顶点删除(多段线可以带圆弧)—源码分享(4月22日更新)
本帖最后由 天天问 于 2022-4-22 23:31 编辑=========2022-4-22更新======
此次作了一些优化:
1.合并之前的2个函数,以后只用一个命令,自动识别多段线是否有圆弧,再自动进行多段线减点操作。一来简化操作,二来避免用户主动错误使用命令。
2.优化了命令执行效率,尽量用entmake命令绘制线,减少了命令执行过程的时间。
之前已经下载过的朋友,可以在评论区留下邮箱,我会把最新的lsp发送到您指定的邮箱。
=========2022-4-3更新======
经过优化,此命令已可以处理带圆弧的多段线,缺点是处理的效率低了一点点。
为兼顾效率和使用场景,分成2个命令使用:ddxjd1不能处理圆弧,但效率较高。
ddxjd2可以处理圆弧,但效率略低。根据情况选择使用。
第一次下载的朋友,请直接下载“多段线减点-2022-4-3升级版”。
之前已经付币下载了的朋友无需再次购买,请在评论区留下邮箱,我会将升级版lsp发到您的邮箱。
缺 FF:SUBST_N函数的朋友,请移步到7楼下载。
因算法的原因,使用中如果遇到“除数为零”的错误,是因为判断三点共线的程序有BUG,已在15楼的回复贴中给了新的函数(有2个),请自行拷贝替换。
=============以下是原贴==============
多段线顶点密集时严重影响编辑效率,从事土木行业的朋友经常遇到类似情况。
在 wzg356 大神提供的lsp(http://bbs.mjtd.com/thread-184978-1-1.html2楼)基础上进行了一点点优化:
1.顶点过滤的范围由用户自定义指定。
2.增加了三点共线的容差自定义选项。
3.增加了夹角较大时不删除点的选项,且临界夹角由用户输入指定。
此命令目前还不能处理多段线里包含的圆弧。介意的朋友慎重下载。(处理带圆弧多段线的功能已上线)
币太少了下载资料不够用,分享一点资料挣点资料费。
Q晋胡 发表于 2022-4-6 15:04
为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点 ...
如果遇到除数为0的错误,是因为三点共线的检测有个BUG。使用下面的这个函数替换之前的函数。
(defun ff:3pt_in_line (p1 p2 p3 ang1 / bolnv1 v2 )
(setq boln nil)
(setq v1 (mapcar '- p1 p2) v2 (mapcar '- p2 p3))
(if (and
(equal (car v1) 0 1e-4)
(equal (car v2) 0 1e-4)
)
(setq boln T) ;当x1-x2=0,且x2-x3=0时,证明p1p2p3三点共线,且该线平行于y轴(斜率无穷大)
)
(if (and
(/= (car v1) 0)
(/= (car v2) 0)
(equal (/ (cadr v1) (car v1)) (/ (cadr v2) (car v2)) (/ (sin (angtof ang1)) (cos (angtof ang1))))
)
(setq boln T) ;当x1-x2≠0,且x2-x3≠0,且直线p1p2与直线p2p3的斜率在容差范围内相等时,证明p1p2p3三点共线。此处equal的容差取值为tanA
)
boln
)
(defun ff:check_3pt_in_line (p1 p2 p3 ang1 / bolnv1 v2 )
(setq boln nil)
(setq v1 (mapcar '- p1 p2) v2 (mapcar '- p2 p3))
(if (and
(equal (car v1) 0 1e-4)
(equal (car v2) 0 1e-4)
)
(setq boln T) ;当x1-x2=0,且x2-x3=0时,证明p1p2p3三点共线,且该线平行于y轴(斜率无穷大)
)
(if (and
(/= (car v1) 0)
(/= (car v2) 0)
(equal (/ (cadr v1) (car v1)) (/ (cadr v2) (car v2)) (/ (sin (angtof ang1)) (cos (angtof ang1))))
)
(setq boln T) ;当x1-x2≠0,且x2-x3≠0,且直线p1p2与直线p2p3的斜率在容差范围内相等时,证明p1p2p3三点共线。此处equal的容差取值为tanA
)
boln
)
bssurvey 发表于 2022-4-6 11:19
錯誤: no function definition: FF:SUBST_N
(defun ff:subst_n (n a lst)
;函数功能:用指定的子表,替换lst中第n个元素,n从0开始计数
;语法:(ff:subst_n 顺序号n子表a原表lst)
(cond
((numberp n)
(if (zerop n)
(append (list a) (cdr lst))
(cons (car lst) (ff:subst_n (1- n) a (cdr lst)))
)
)
((listp n)
(cond
((equal (length n) 1)
(if (zerop (car n))
(append (list a) (cdr lst))
(cons (car lst) (ff:subst_n (1- (car n)) a (cdr lst)))
)
)
((> (length n) 1)
(if (zerop (car n))
(cons (ff:subst_n (cdr n) a (car lst)) (cdr lst))
(cons (car lst)
(ff:subst_n (append (list (1- (car n))) (cdr n)) a (cdr lst))
)
)
)
)
)
)
)
天天问 发表于 2022-4-6 14:37
测试了一下,矩形是封闭多段线,用这个命令处理,也能处理边上共线的多余顶点,但是最终的多段线会不闭合 ...
为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点才能成功
实用的功能,点赞。 不错的小工具。支持。。。 支持,不过5K多代码,有点复杂了。论坛里有相关比较简单的插件。
实用的功能,点赞。 錯誤: no function definition: FF:SUBST_N 可以使用了 感謝您! bssurvey 发表于 2022-4-6 11:56
可以使用了 感謝您!
不客气,谢谢您的支持 转折的多段线不能优化顶点吗?