乐于分享
好东西不私藏

【源码】点与多段线位置关系

【源码】点与多段线位置关系
通过 VLISP 编写程序,选取点与多段线,计算他们之间的关系并注记。
;;;;获取多段线坐标;;;;XUYANYAN;;;;2026/7/3(defun getplvtx( / entp entpa ent obj coords i vlxlst)  (setq entpa(entsel "\n选取多段线: ")	ent(car entpa)	entp(cadr entpa))  (if ent    (progn      (setq obj (vlax-ename->vla-object ent)i 0 vlxlst nil)      (if (wcmatch (vla-get-objectname obj) "*Polyline")	  (setq	coords (vlax-safearray->list			 (vlax-variant-value			   (vla-get-coordinates obj)))))    (repeat(/(length coords)2)      (setq vlxlst(append vlxlst(list(list(nth i coords)(nth(1+ i)coords))))i(+ 2 i)))))  (if(<(distance entp(car vlxlst))(distance entp(last vlxlst)))  vlxlst(reverse vlxlst)));;;;点的旋转变换(defun rotate (alfa lst)  (list(-(*(cos alfa)(car lst))(*(sin alfa)(cadr lst)))       (+(*(sin alfa)(car lst))(*(cos alfa)(cadr lst)))));;;;点在线段上投影(defun linf(p0 p1 alfa / dxdy)  (setq dxdy(mapcar'- p1 p0)        p1l(rotate(- alfa)dxdy)));;;;确定多线与测试点关系(defun findps(lst pt / i SumD conj)  (setq i 0 SumD 0	conj(lambda(pt)(list(car pt)(-(cadr pt)))))  (while(and(<(car(linf(nth(1+ i)lst)pt(angle(nth(1+ i)lst)(nth i lst))))0)	    (< i(length lst)))    (setq i(1+ i)SumD(+ SumD(distance(nth(1- i)lst)(nth i lst)))))  (mapcar'+(list SumD 0)(conj(linf(nth i lst)pt(setq ac(angle(nth i lst)(nth(1+ i)lst)))))));;;;点要素标注(defun pDIM(str a / pj ad)  (entmake(list'(0 . "MTEXT")'(100 . "AcDbEntity")	       '(100 . "AcDbMText")'(7 . "Standard")(cons 71(if(>(setq pj(cadr pacc))0)4 6))	       (cons 50(setq ad(+(* -0.5 pi)ac)))(cons 1 str)(cons 10 ppt)))  (entmake (list '(0 . "LINE") (cons 10 ppt) (cons 11(polar ppt ad(- pj))))));;;主函数功能测试(defun C:TT1(/ vlst ppt ac pacc pinf)  (setq vlst(getplvtx))  (while(setq ppt(getpoint"\n指定点 <Exit> :"))    (setq pacc(findps vlst ppt)	  pinf(strcat"长度:"(rtos(car pacc)2 3)		     "\\P偏距:"(rtos(cadr pacc)2 3)))    (pDIM pinf ac))  (princ"\n** APPLICATION END **")(princ))
绘图截屏
绘图录屏
已关注
关注
重播 分享
注:
1、含圆弧段多段线标注不准确;
2、用户可根据需要进行扩展。