天天问 发表于 2022-3-30 21:21:54

多段线顶点过滤/顶点删除(多段线可以带圆弧)—源码分享(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.增加了夹角较大时不删除点的选项,且临界夹角由用户输入指定。

此命令目前还不能处理多段线里包含的圆弧。介意的朋友慎重下载。(处理带圆弧多段线的功能已上线)


币太少了下载资料不够用,分享一点资料挣点资料费。






天天问 发表于 2022-4-6 16:40:10

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
        )       

天天问 发表于 2022-4-6 11:21:28

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))
                                                )
                                        )
                                )
                        )
    )
)
)       

Q晋胡 发表于 2022-4-6 15:04:44

天天问 发表于 2022-4-6 14:37
测试了一下,矩形是封闭多段线,用这个命令处理,也能处理边上共线的多余顶点,但是最终的多段线会不闭合 ...

为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点才能成功

lxl217114 发表于 2022-3-31 17:52:10

实用的功能,点赞。

f4800 发表于 2022-4-2 07:42:32

不错的小工具。支持。。。

qazxswk 发表于 2022-4-2 15:30:52

支持,不过5K多代码,有点复杂了。论坛里有相关比较简单的插件。

czb203 发表于 2022-4-2 19:41:45


实用的功能,点赞。

bssurvey 发表于 2022-4-6 11:19:14

錯誤: no function definition: FF:SUBST_N

bssurvey 发表于 2022-4-6 11:56:39

可以使用了 感謝您!

天天问 发表于 2022-4-6 11:58:53

bssurvey 发表于 2022-4-6 11:56
可以使用了 感謝您!

不客气,谢谢您的支持

Q晋胡 发表于 2022-4-6 12:38:03

转折的多段线不能优化顶点吗?
页: [1] 2 3 4
查看完整版本: 多段线顶点过滤/顶点删除(多段线可以带圆弧)—源码分享(4月22日更新)