拼凑的自动基线标注;看有没人有心情完善;搞累了;效果不行
自动基线标注,貌似全网也没见过; 坐标标注倒是很多;
 - (defun c:A23 (/ pt ss pts xVals yVals xOffset yOffset)
- ;; 初始化设置
- (setvar "CMDECHO" 0)
- (setvar "OSMODE" 439)
- (setvar "DIMSCALE" 1)
-
- ;; 获取基准点(强制二维)
- (if (not (setq pt (getpoint "\n指定基准点: ")))
- (exit)
- )
- (setq pt (list (car pt) (cadr pt)))
-
- ;; 选择对象(增强过滤)
- (while (not (setq ss (ssget '((0 . "LINE,LWPOLYLINE,SPLINE")))))
- (princ "\n请选择直线、多段线或样条曲线!")
- )
-
- ;; 提取端点(二维优化)
- (setq pts (Get2DEndpoints ss pt))
- (setq xVals (vl-sort (mapcar 'car pts) '<)
- yVals (vl-sort (mapcar 'cadr pts) '<))
-
- ;; 设置标注偏移参数
- (setq xOffset 20) ; X方向标注基线偏移量
- (setq yOffset 20) ; Y方向标注基线偏移量
- (setq dimGap 8) ; 相邻标注之间的间隔
-
- ;; 生成X方向标注(带间隔)
- (setq i 0)
- (foreach x (vl-remove-if '(lambda (n) (equal n (car pt) 1e-6)) xVals)
- (command "_.DIMLINEAR"
- "_non" pt
- "_non" (list x (cadr pt))
- "_non" (polar pt (/ pi 2) (+ yOffset (* i dimGap))))
- (setq i (1+ i))
- )
-
- ;; 生成Y方向标注(带间隔)
- (setq i 0)
- (foreach y (vl-remove-if '(lambda (n) (equal n (cadr pt) 1e-6)) yVals)
- (command "_.DIMLINEAR"
- "_non" pt
- "_non" (list (car pt) y)
- "_non" (polar pt 0 (+ xOffset (* i dimGap))))
- (setq i (1+ i))
- )
-
- (princ (strcat "\n生成标注: X方向" (itoa (length xVals)) "个, Y方向" (itoa (length yVals)) "个"))
- (princ)
- )
- ;; 二维端点提取函数(保持不变)
- (defun Get2DEndpoints (ss base / ent pts)
- (vl-load-com)
- (repeat (setq i (sslength ss))
- (setq ent (ssname ss (setq i (1- i))))
- (cond
- ((= (cdr (assoc 0 (entget ent))) "LINE")
- (mapcar '(lambda (p) (setq pts (cons (list (car p) (cadr p)) pts)))
- (list (cdr (assoc 10 (entget ent))) (cdr (assoc 11 (entget ent)))))
- )
- ((wcmatch (cdr (assoc 0 (entget ent))) "*POLYLINE")
- (foreach v (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
- (setq pts (cons (list (cadr v) (caddr v)) pts))
- )
- )
- )
- )
- ;; 去重并排除基准点
- (vl-remove-if '(lambda (x) (equal x base 1e-6))
- (vl-sort pts '(lambda (a b) (if (equal (car a) (car b) 1e-6)
- (< (cadr a) (cadr b))
- (< (car a) (car b))))))
- )
|