明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5861|回复: 32

多段线顶点过滤/顶点删除(多段线可以带圆弧)—源码分享(4月22日更新)

  [复制链接]
发表于 2022-3-30 21:21:54 | 显示全部楼层 |阅读模式
本帖最后由 天天问 于 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.增加了夹角较大时不删除点的选项,且临界夹角由用户输入指定。

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


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






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

虽然一直想写这么个工具,实在是懒癌严重... 非常感谢!  发表于 2022-3-31 09:36

评分

参与人数 2明经币 +1 金钱 +15 收起 理由
bssurvey + 1 赞一个!
e2002 + 15

查看全部评分

本帖被以下淘专辑推荐:

 楼主| 发表于 2022-4-6 16:40:10 | 显示全部楼层
Q晋胡 发表于 2022-4-6 15:04
为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点 ...

如果遇到除数为0的错误,是因为三点共线的检测有个BUG。使用下面的这个函数替换之前的函数。
        (defun ff:3pt_in_line (p1 p2 p3 ang1 / boln  v1 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 / boln  v1 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))
                                                )
                                        )
                                )
                        )
    )
  )
)       
发表于 2022-4-6 15:04:44 | 显示全部楼层
天天问 发表于 2022-4-6 14:37
测试了一下,矩形是封闭多段线,用这个命令处理,也能处理边上共线的多余顶点,但是最终的多段线会不闭合 ...

为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点才能成功
发表于 2022-3-31 17:52:10 | 显示全部楼层
实用的功能,点赞。
发表于 2022-4-2 07:42:32 来自手机 | 显示全部楼层
不错的小工具。支持。。。
发表于 2022-4-2 15:30:52 | 显示全部楼层
支持,不过5K多代码,有点复杂了。论坛里有相关比较简单的插件。
发表于 2022-4-2 19:41:45 | 显示全部楼层

实用的功能,点赞。
发表于 2022-4-6 11:19:14 | 显示全部楼层
錯誤: no function definition: FF:SUBST_N
发表于 2022-4-6 11:56:39 | 显示全部楼层
可以使用了 感謝您!
 楼主| 发表于 2022-4-6 11:58:53 | 显示全部楼层
bssurvey 发表于 2022-4-6 11:56
可以使用了 感謝您!

不客气,谢谢您的支持
发表于 2022-4-6 12:38:03 | 显示全部楼层
转折的多段线不能优化顶点吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 10:17 , Processed in 0.198358 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表