lengxiaxi 发表于 前天 17:12

拼凑的自动对齐标注

拼凑的自动基线标注;看有没人有心情完善;搞累了;效果不行



自动基线标注,貌似全网也没见过; 坐标标注倒是很多;

(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))))))
)


你有种再说一遍 发表于 前天 17:20

没懂你这个标什么,怎么不是连续标注,然后上下左右都标

sunny_8848 发表于 前天 20:12

本帖最后由 sunny_8848 于 2025-4-28 20:20 编辑

看起来挺好的,需要消除有些重复尺寸

ghgh0130 发表于 昨天 00:18

加油。。。。:handshake

pizi158545086 发表于 昨天 10:14

感谢分享            

lengxiaxi 发表于 昨天 16:21

你有种再说一遍 发表于 2025-4-28 17:20
没懂你这个标什么,怎么不是连续标注,然后上下左右都标

没有避让,看起来像是4个方向;实际只有2个方向
页: [1]
查看完整版本: 拼凑的自动对齐标注