明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3019|回复: 5

[讨论] 多段线顶点太多,如何过滤删除多余的点?[已解决]

[复制链接]
发表于 2022-3-19 16:59:21 | 显示全部楼层 |阅读模式
本帖最后由 天天问 于 2022-4-9 22:01 编辑

这个问题已经自己解决了,详见我的帖子里的附件,链接在此:http://bbs.mjtd.com/thread-185068-1-1.html

================以下是原贴===================
平时会遇到多段线顶点非常密的线条,对其进行操作时软件很卡顿。

有一些软件/插件会有一种功能:把多段线顶点抽稀,在给定精度下尽量保持多段线的线条样子。
已知的有南方CASS里的复合线滤波、ZDM里的多段线减点。


不知道群里有没有朋友收藏的有lsp程序具有类似功能。


================以下是原贴===================
平时会遇到多段线顶点非常密的线条,对其进行操作时软件很卡顿。

有一些软件/插件会有一种功能:把多段线顶点抽稀,在给定精度下尽量保持多段线的线条样子。
已知的有南方CASS里的复合线滤波、ZDM里的多段线减点。


不知道群里有没有朋友收藏的有lsp程序具有类似功能。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2022-3-19 19:21:47 | 显示全部楼层
本帖最后由 wzg356 于 2022-3-19 20:13 编辑

;多线段节点抽稀
;(delpiont pts nil);符合三点一线规则时,抽掉中间点
;(delpiont pts 10);符合三点一线规则时,抽掉中间点。抽掉点间距小于d的点
(defun delpiont (pts d / nthrm yy-3ptinline yy-3ptdstance pts1)
(defun nthrm (n lst)
  (if (null lst)   nil
    (if (zerop n) (cdr lst)
      (cons (car lst) (nthrm (- n 1) (cdr lst)))
    )
  )
)
(defun yy-3ptinline (p1 p2 p3 / v1 v2)
    (setq v1 (mapcar '- p1 p2) v2 (mapcar '- p1 p3))
    (if (equal (car v1) 0.0 1e-4)
        (equal (car v1) (car v2) 1e-4)
        (equal (abs(/ (cadr v1) (car v1))) (abs(/ (cadr v2) (car v2))) 1e-4)
    )
)
(setq pts1 nil)
(while (> (length pts) 2)
        (if        (or        (yy-3ptinline (car pts) (cadr pts) (caddr pts));三点一线法
                        (if d(< (distance (car pts) (cadr pts)) d));距离法       
                )
                (setq pts(nthrm 1 pts))
                (setq pts1 (cons (car pts) pts1)
                    pts (cdr pts)
                )       
        )
)
(cons (cadr pts)(cons (car pts) pts1))
)

;[功能]entmake生成多段线
(defun Ent:Make_2DPoly (pts / e)
  (setq e (Entmake (list '(0 . "POLYLINE") '(70 . 0))))
  (foreach p pts
    (entmake (list '(0 . "VERTEX") '(70 . 0) (cons 10 p)))
  )
  (entmake '((0 . "SEQEND")))
  e
)
(defun makeplc(pts)
(entmakex(append(mapcar 'cons (list 0 100 100 90 38 43)
(list "LWPOLYLINE" "AcDbEntity" "AcDbPolyline" (length pts)  0 0.0))
(mapcar '(lambda (p)(cons 10 p)) pts)))
)
(defun c:pldp ( / E pts)
        (and(setq e(ssget ":E:S" '((0 . "LWPOLYLINE"))))
                (setq e(ssname e 0))
                (setq pts (mapcar 'cdr (vl-remove-if  '(lambda (x) (/= (car x) 10))(entget e))))
                (makeplc (delpiont pts 10.));抽掉中间点,抽掉点间距小于10的点后的新线
                (command "_matchprop" e (entlast) "")
        )       
)
 楼主| 发表于 2022-3-20 12:00:32 | 显示全部楼层
wzg356 发表于 2022-3-19 19:21
;多线段节点抽稀
;(delpiont pts nil);符合三点一线规则时,抽掉中间点
;(delpiont pts 10);符合三点一线 ...

大佬,您这个程序是仅适用于多点共线时抽稀吗?
曲线上节点过于密集时能不能用?

我用在曲线上失败了,用在多点共线的时候没问题。
发表于 2022-3-20 17:35:06 来自手机 | 显示全部楼层
最小点间距要合适
发表于 2024-10-9 19:34:19 | 显示全部楼层
感谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 12:02 , Processed in 0.173792 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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