;同时标注管径和管长的程序(支持直线和多段线) ;*****************参数初始化********************** (vl-load-com) (terpri) (prompt "程序初始化......") (terpri) (setq bl (if(setq bl (getreal "输入出图比例1:[1/2/5/10/20/50/100/1000]<1>:")) bl 1.0)) (setq gao (* bl 3.0)) (setq tg (strcat "标注文字高度<" (rtos gao) ">:")) (setq gao (if(setq xxx (getreal tg)) xxx gao)) (setq xiaoshu (getint "请输入精度位数[整数(0)/1位(1)/2位(2)/3位(3)]<1>: ")) (if (= xiaoshu nil) (setq xiaoshu 1)) (terpri) (prompt "管长管径标注程序加载完毕,启动命令:GDBZ") ;*************初始化完毕******************** (defun c:GDBZ (/ jl pt1 pt2 x1 y1 z1 x2 y2 z2 ts ag wz du dnwz dnin dnout ob e ee obj) (setvar "dimzin" 0) ;; *** 修改:同时支持直线和多段线 *** (setq ob (ssget '((0 . "LINE,LWPOLYLINE")))) (if (not ob) (exit)) ; 没选到对象则退出 (setq dn (if(> dn 0) dn 800)) (setq ts (strcat "输入管径<" (itoa dn) ">:")) (setq dn (if(setq dnin (getint ts)) dnin dn)) (repeat (setq ee (sslength ob)) (setq e (ssname ob (setq ee (1- ee)))) (setq obj (vlax-ename->vla-object e)) ;; *** 新增:判断对象类型,分别获取起终点 *** (cond ;; 多段线:获取起点和终点 ((= (vla-get-ObjectName obj) "AcDbPolyline") (setq pt1 (vlax-curve-getstartpoint obj) pt2 (vlax-curve-getendpoint obj) jl (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)))) ; 多段线总长 ;; 直线 ((= (vla-get-ObjectName obj) "AcDbLine") (setq pt1 (vlax-curve-getstartpoint obj) pt2 (vlax-curve-getendpoint obj) jl (distance pt1 pt2))) ) ;; *** 新增:确保 pt1 在左,pt2 在右(按X坐标)*** (if (< (car pt2) (car pt1)) (setq tmp pt1 pt1 pt2 pt2 tmp)) ;; 计算起点到终点的角度(整体方向) (setq ag (angle pt1 pt2)) ;; 生成标注文字 (setq dnout (strcat "DN" (itoa dn) " L=" (rtos (/ jl 1000.0) 2 xiaoshu) "m")) ;; 计算起点到终点的中点作为标注位置基准 (setq wz (polar pt1 ag (/ (distance pt1 pt2) 2))) ;; 将角度调整到 0~pi,确保文字正向 (setq ag (if (and (> ag (/ pi 2)) (< ag (* pi 1.5))) (- ag pi) ag)) ;; 标注位置:中点上方偏移 (setq dnwz (polar wz (+ ag (/ pi 2)) (* 3.5 bl))) (setq du (/ (* ag 180) pi)) (setq wdpt1 (polar wz 2.356 100)) (setq wdpt2 (polar wz -0.785 100)) (command "zoom" wdpt1 wdpt2) ;; 标注文字,居中对正 (command "text" "j" "mc" dnwz gao du dnout) ) (command "zoom" "previous") (setvar "dimzin" 8) (princ))