分享一个假封闭多段线转为真封闭的源码
在论坛里面下载的黄明儒大师的中心线代码,经常碰到一个情况,就是假封闭的多段线,无法被选中,也无法生成中心线。于是写了这个函数。
所谓假封闭,就是起点和终点相等,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)
)
)
)
寒潮大冬瓜 发表于 2025-3-23 21:23
很好→很棒!很好~很棒!!很好……很棒!!!
只是我运行→先画一个闭合的多段线,然后切了 ...
不能有缺口,起点和终点重合。 本帖最后由 寒潮大冬瓜 于 2025-3-23 21:51 编辑
很好→很棒!很好~很棒!!很好……很棒!!!
只是我运行→先画一个闭合的多段线,然后切了一个缺口,运行代码→选了多段线→无法进入下一步? 曲线怎么写。:handshake (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吗 aws 发表于 2025-3-24 08:17
(if(null(vlax-curve-isClosed obj))
(if(equal(vlax-curve-getStartPoint obj)(vlax-curve-getEndPo ...
不清楚,和普通封闭多边形,多了一个节点。 ghgh0130 发表于 2025-3-24 07:22
曲线怎么写。
多段线的曲线就是圆弧,我这个代码,不需要修改节点位置,只要凸度不变就行,比较简单。如果要修改节点位置来封闭多段线,那是一个数学问题,没有研究过。 假封闭是什么意思 biya 发表于 2025-3-24 09:00
假封闭是什么意思
画多段线的时候,真封闭是用c封闭的,假封闭,将最后一个点画在起点的位置,看上去是封闭的,cad不认。 hubeiwdlue 发表于 2025-3-24 09:12
画多段线的时候,真封闭是用c封闭的,假封闭,将最后一个点画在起点的位置,看上去是封闭的,cad不认。
哦,知道了,这个好弄,把原组码处理一下就行了
页:
[1]
2