明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 106|回复: 3

[讨论] 拼凑的自动对齐标注

[复制链接]
发表于 昨天 17:12 | 显示全部楼层 |阅读模式
拼凑的自动基线标注;看有没人有心情完善;搞累了;效果不行



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

  1. (defun c:A23 (/ pt ss pts xVals yVals xOffset yOffset)
  2.   ;; 初始化设置
  3.   (setvar "CMDECHO" 0)
  4.   (setvar "OSMODE" 439)
  5.   (setvar "DIMSCALE" 1)
  6.   
  7.   ;; 获取基准点(强制二维)
  8.   (if (not (setq pt (getpoint "\n指定基准点: ")))
  9.     (exit)
  10.   )
  11.   (setq pt (list (car pt) (cadr pt)))
  12.   
  13.   ;; 选择对象(增强过滤)
  14.   (while (not (setq ss (ssget '((0 . "LINE,LWPOLYLINE,SPLINE")))))
  15.     (princ "\n请选择直线、多段线或样条曲线!")
  16.   )
  17.   
  18.   ;; 提取端点(二维优化)
  19.   (setq pts (Get2DEndpoints ss pt))
  20.   (setq xVals (vl-sort (mapcar 'car pts) '<)
  21.         yVals (vl-sort (mapcar 'cadr pts) '<))
  22.   
  23.   ;; 设置标注偏移参数
  24.   (setq xOffset 20)  ; X方向标注基线偏移量
  25.   (setq yOffset 20)  ; Y方向标注基线偏移量
  26.   (setq dimGap 8)    ; 相邻标注之间的间隔
  27.   
  28.   ;; 生成X方向标注(带间隔)
  29.   (setq i 0)
  30.   (foreach x (vl-remove-if '(lambda (n) (equal n (car pt) 1e-6)) xVals)
  31.     (command "_.DIMLINEAR"
  32.              "_non" pt
  33.              "_non" (list x (cadr pt))
  34.              "_non" (polar pt (/ pi 2) (+ yOffset (* i dimGap))))
  35.     (setq i (1+ i))
  36.   )
  37.   
  38.   ;; 生成Y方向标注(带间隔)
  39.   (setq i 0)
  40.   (foreach y (vl-remove-if '(lambda (n) (equal n (cadr pt) 1e-6)) yVals)
  41.     (command "_.DIMLINEAR"
  42.              "_non" pt
  43.              "_non" (list (car pt) y)
  44.              "_non" (polar pt 0 (+ xOffset (* i dimGap))))
  45.     (setq i (1+ i))
  46.   )
  47.   
  48.   (princ (strcat "\n生成标注: X方向" (itoa (length xVals)) "个, Y方向" (itoa (length yVals)) "个"))
  49.   (princ)
  50. )

  51. ;; 二维端点提取函数(保持不变)
  52. (defun Get2DEndpoints (ss base / ent pts)
  53.   (vl-load-com)
  54.   (repeat (setq i (sslength ss))
  55.     (setq ent (ssname ss (setq i (1- i))))
  56.     (cond
  57.       ((= (cdr (assoc 0 (entget ent))) "LINE")
  58.        (mapcar '(lambda (p) (setq pts (cons (list (car p) (cadr p)) pts)))
  59.                (list (cdr (assoc 10 (entget ent))) (cdr (assoc 11 (entget ent)))))
  60.       )
  61.       ((wcmatch (cdr (assoc 0 (entget ent))) "*POLYLINE")
  62.        (foreach v (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
  63.          (setq pts (cons (list (cadr v) (caddr v)) pts))
  64.        )
  65.       )
  66.     )
  67.   )
  68.   ;; 去重并排除基准点
  69.   (vl-remove-if '(lambda (x) (equal x base 1e-6))
  70.                 (vl-sort pts '(lambda (a b) (if (equal (car a) (car b) 1e-6)
  71.                                               (< (cadr a) (cadr b))
  72.                                               (< (car a) (car b))))))
  73. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 昨天 17:20 | 显示全部楼层
没懂你这个标什么,怎么不是连续标注,然后上下左右都标
回复 支持 反对

使用道具 举报

发表于 昨天 20:12 | 显示全部楼层
本帖最后由 sunny_8848 于 2025-4-28 20:20 编辑

看起来挺好的,需要消除有些重复尺寸
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-29 00:59 , Processed in 0.220120 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表