; DDF标注命令 - 修正横向标尺位置,仅显示标尺无文字
(defun c:DDF (/ pt1 pt2 ss intlist lds olden pts1 pts2 n ens code i ptx endata dist
total-dist total-pt1 total-pt2 dir-ang offset-dist total-dim-obj
base-dim-pt orig-offset-ang orig-offset-dist)
(setq filter-sizes (vl-sort '( 0 36 1) '<)
offset-dist 120) ; 固定距离120mm
(setq pt1 (getpoint "\n指定标注起始点: "))
(if (null pt1) (progn (princ "\n命令取消") (return)))
(setq pt2 (getpoint pt1 "\n指定标注方向: "))
(if (null pt2) (progn (princ "\n命令取消") (return)))
(if (setq ss (ssget "F" (list pt1 pt2) '((0 . "*E,CIRCLE,ARC")(6 . "BYLAYER"))))
(if (not (vl-some '(lambda (p) (equal p pt tolerance)) intlist))
(setq intlist (cons pt intlist))
(setq lds (+ 10 (distance pt1 pt2))
intlist (vl-remove-if-not
'(lambda (x) (<= (distance x pt1) lds))
'(lambda (x y) (< (distance pt1 x) (distance pt1 y)))))
(if (< (length intlist) 2)
(progn (princ "\n有效交点不足,无法标注") (return))
(repeat (- (length intlist) 1)
(setq pts1 (nth n intlist)
pts2 (nth (1+ n) intlist)
dist (distance pts1 pts2))
(if (and (> dist tolerance)
(and (>= dist (- s tolerance))
(<= dist (+ s tolerance))))
(ddf_entmakedim pts1 pts2) ; 调用无文字标注函数
(while (setq ens (entnext olden))
(setq base-dim-pt (cdr (assoc 10 (entget (ssname ss 0)))))
(setq base-dim-pt (midpoint pt1 pt2)) ; fallback基准点
; -------------------- 总长标注逻辑 --------------------
(setq total-pt1 (car intlist)
total-dist (distance total-pt1 total-pt2)
dir-ang (angle total-pt1 total-pt2)) ; 标注方向角度
; 横向(水平)标注时强制向下偏移,其他方向按原逻辑
(if (or (equal dir-ang 0 0.001) (equal dir-ang pi 0.001)) ; 水平方向判断
(+ dir-ang (/ pi 1.5)) ; 横向向下偏移(避免上移)
(+ dir-ang (/ pi 2)) ; 其他方向正常外侧偏移
orig-offset-dist offset-dist
(setq total-dim-pt (polar base-dim-pt orig-offset-ang orig-offset-dist))
'(100 . "AcDbAlignedDimension")
'(100 . "AcDbRotatedDimension")
(setq total-dim-obj (entlast))
; ------------------------------------------------------
(while (and (setq code (grread T 8))
(setq endata (entget (ssname ss i)))
(entmod (subst (cons 10 ptx) (assoc 10 endata) endata))
(setq new-total-pt (polar ptx orig-offset-ang orig-offset-dist)
total-endata (entget total-dim-obj))
(entmod (subst (cons 10 new-total-pt) (assoc 10 total-endata) total-endata))
(princ "\n标注完成(横向标尺已修正,无文字)")
(list (/ (+ (car p1) (car p2)) 2.0)
(/ (+ (cadr p1) (cadr p2)) 2.0)
(defun ddf_entmakedim (pt1 pt2 / ang)
(setq ang (angle pt1 pt2))
((or (equal 0 ang 0.001) (equal pi ang 0.001)) ; 水平
'(100 . "AcDbAlignedDimension")
'(100 . "AcDbRotatedDimension")
((or (equal (/ pi 2) ang 0.001) (equal (* pi 1.5) ang 0.001)) ; 垂直
'(100 . "AcDbAlignedDimension")
'(100 . "AcDbAlignedDimension")
(princ "\nDDF标注命令加载完成,输入DDF启动(横向修正版)")