;;;;获取多段线坐标;;;;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 0conj(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))

已关注
关注
重播 分享 赞
夜雨聆风