hubeiwdlue 发表于 2025-3-23 19:52:57

分享一个假封闭多段线转为真封闭的源码

在论坛里面下载的黄明儒大师的中心线代码,经常碰到一个情况,就是假封闭的多段线,无法被选中,也无法生成中心线。
于是写了这个函数。


所谓假封闭,就是起点和终点相等,70组码为0
真封闭相对假封闭,节点数少1个,起点和终点不相等。
;(ClosedLwp (car(entsel "\n选择线...")))
(defun ClosedLwp (en / endpt es lst1 startpt z210 z70 z90)
(if (and
      (setq es (entget en)
          z90 (cdr (assoc 90 es));节点数
          z70 (cdr (assoc 70 es))
          z210 (assoc 210 es);210组码
          startpt (cdr (assoc 10 es))
          endpt (cdr (assoc 10 (reverse es))))
      (eq (cdr (assoc 0 es)) "LWPOLYLINE")
      (> z90 3)
      (eq z70 0)
      (equal startpt endpt 1e-5)
      )
    (progn
      ;去除最后一个节点
      (vl-some '(lambda(x) (setq lst1 (cdr lst1)) (= 10 (car x))) (setq lst1 (reverse es)))
      (setq lst1 (reverse lst1))
      (setq es (append lst1 (list z210)))
      ;更新节点数和是否封闭
      (setq es (subst (cons 90 (1- z90)) (cons 90 z90) es))
      (setq es (subst '(70 . 1) (cons 70 z70) es))
      (entmod es)
    )
)
)


hubeiwdlue 发表于 2025-3-23 22:03:16

寒潮大冬瓜 发表于 2025-3-23 21:23
很好→很棒!很好~很棒!!很好……很棒!!!
只是我运行→先画一个闭合的多段线,然后切了 ...

不能有缺口,起点和终点重合。

寒潮大冬瓜 发表于 2025-3-23 21:23:46

本帖最后由 寒潮大冬瓜 于 2025-3-23 21:51 编辑

很好→很棒!很好~很棒!!很好……很棒!!!
只是我运行→先画一个闭合的多段线,然后切了一个缺口,运行代码→选了多段线→无法进入下一步?

ghgh0130 发表于 2025-3-24 07:22:27

曲线怎么写。:handshake

aws 发表于 2025-3-24 08:17:06

                (if(null(vlax-curve-isClosed obj))
                        (if(equal(vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj)0.1)
                                (entmod(subst(cons 70 1)(assoc 70(entget en))(entget en)))
                               
                        )
                )我都是这么处理的,也没细想,会有bug吗

hubeiwdlue 发表于 2025-3-24 08:42:15

aws 发表于 2025-3-24 08:17
(if(null(vlax-curve-isClosed obj))
                        (if(equal(vlax-curve-getStartPoint obj)(vlax-curve-getEndPo ...

不清楚,和普通封闭多边形,多了一个节点。

hubeiwdlue 发表于 2025-3-24 08:48:23

ghgh0130 发表于 2025-3-24 07:22
曲线怎么写。

多段线的曲线就是圆弧,我这个代码,不需要修改节点位置,只要凸度不变就行,比较简单。如果要修改节点位置来封闭多段线,那是一个数学问题,没有研究过。

biya 发表于 2025-3-24 09:00:29

假封闭是什么意思

hubeiwdlue 发表于 2025-3-24 09:12:22

biya 发表于 2025-3-24 09:00
假封闭是什么意思

画多段线的时候,真封闭是用c封闭的,假封闭,将最后一个点画在起点的位置,看上去是封闭的,cad不认。

biya 发表于 2025-3-24 09:13:37

hubeiwdlue 发表于 2025-3-24 09:12
画多段线的时候,真封闭是用c封闭的,假封闭,将最后一个点画在起点的位置,看上去是封闭的,cad不认。

哦,知道了,这个好弄,把原组码处理一下就行了
页: [1] 2
查看完整版本: 分享一个假封闭多段线转为真封闭的源码