明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 250|回复: 5

[提问] 合并标注

[复制链接]
发表于 昨天 21:25 | 显示全部楼层 |阅读模式
还是不能实现,请大佬们修正完善
;;; 合并标注工具(兼容所有CAD版本)- 修正版
(defun c:dmrg (/ *error* ss dims ptlst old_osm old_dimzin old_dimstyle)
  ;; 错误处理函数
  (defun *error* (msg)
    (if old_osm (setvar "osmode" old_osm))
    (if old_dimzin (setvar "dimzin" old_dimzin))
    (if old_dimstyle (setvar "dimstyle" old_dimstyle))
    (princ (strcat "\n错误: " msg))
    (princ))

  ;; 保存系统变量
  (setq old_osm (getvar "osmode")
        old_dimzin (getvar "dimzin")
        old_dimstyle (getvar "dimstyle"))

  ;; 选择标注集合并检查
  (princ "\n选择要合并的标注: ")
  (if (not (setq ss (ssget '((0 . "DIMENSION")))))
    (progn (princ "\n未选择标注!") (exit)))

  ;; 初始化参数(修复列表处理)
  (setvar "osmode" 0)
  (setvar "dimzin" 0)
  (setq dims (vl-remove-if-not '(lambda(x) (eq (type x) 'ENAME)) (mapcar 'cadr (ssnamex ss)))
        ptlst (vl-remove nil (mapcar 'get_dim_points dims))) ; 过滤无效标注

  ;; 检查有效数据
  (if (null ptlst)
    (progn (princ "\n未找到有效标注数据!") (exit)))

  ;; 检查标注类型和方向
  (if (not (check_alignment ptlst))
    (progn (princ "\n标注不在同一直线!") (exit)))

  ;; 排序标注点(增加空列表保护)
  (setq ptlst (sort_points ptlst))

  ;; 创建新标注(增加容错处理)
  (cond
    ((= (getvar "users1") "BASELINE")
      (create_baseline_dim ptlst))
    (t (create_continue_dim ptlst)))

  ;; 删除原标注(增加存在性检查)
  (if (= (getvar "users2") "1")
    (mapcar '(lambda(x) (if (entget x) (entdel x))) dims))

  ;; 恢复系统变量
  (setvar "osmode" old_osm)
  (setvar "dimzin" old_dimzin)
  (setvar "dimstyle" old_dimstyle)
  (princ "\n标注合并完成!")
  (princ))

;;; 获取标注关键点(增加数据有效性检查)
(defun get_dim_points (ent / data p1 p2)
  (cond
    ((null ent) nil)
    ((not (entget ent)) nil)
    (t
      (setq data (entget ent))
      (if (and (assoc 13 data) ; 增加关键组码检查
               (assoc 14 data)
               (assoc 10 data))
        (list
          (cdr (assoc 13 data))  ; 标注点1
          (cdr (assoc 14 data))  ; 标注点2
          (cdr (assoc 10 data))  ; 文字位置
          (cdr (assoc 1 data))   ; 标注文字
          (cdr (assoc 3 data)))   ; 标注样式
        nil)))) ; 返回nil代替无效数据

;;; 检查标注对齐方式(增加空列表保护)
(defun check_alignment (ptlst / ang tolerance)
  (setq tolerance 0.0001)
  (cond
    ((< (length ptlst) 2) t)
    ((vl-every
       '(lambda (a b)
          (and a b (< (abs (- (angle (car a) (cadr a))
                               (angle (car b) (cadr b))))
                       tolerance)))
       ptlst
       (cdr ptlst)))
    (t nil)))

;;; 排序标注点(增强鲁棒性)
(defun sort_points (ptlst / basept)
  (if (and ptlst (car ptlst) (caar ptlst))
    (progn
      (setq basept (caar ptlst))
      (vl-sort ptlst
        '(lambda (a b)
           (and a b (< (distance basept (car a))
                       (distance basept (car b))))))
    ptlst)))

;;; 创建连续标注(增加命令容错)
(defun create_continue_dim (ptlst / p1 p2 txt)
  (if (car ptlst)
    (progn
      (command "_.dimstyle" "r" (cadddr (car ptlst)))
      (foreach dim ptlst
        (if (and dim (car dim) (cadr dim))
          (progn
            (setq p1 (car dim)
                  p2 (cadr dim)
                  txt (caddr dim))
            (if (not (eq dim (car ptlst)))
              (progn
                (command "_.dimcontinue")
                (command (trans p1 0 1) (trans p2 0 1))
                (if (/= txt "") (command "_text" txt)))
              (progn
                (command "_.dimlinear"
                  (trans p1 0 1)
                  (trans p2 0 1)
                  "_none"
                  (trans (caddr dim) 0 1))
                (command txt)))))))))

;;; 创建基线标注(增加坐标系转换)
(defun create_baseline_dim (ptlst / basept p1 p2)
  (if (car ptlst)
    (progn
      (command "_.dimstyle" "r" (cadddr (car ptlst)))
      (setq basept (trans (caar ptlst) 0 1))
      (foreach dim ptlst
        (if (and dim (car dim) (cadr dim))
          (progn
            (setq p1 (trans (car dim) 0 1)
                  p2 (trans (cadr dim) 0 1))
            (if (eq dim (car ptlst))
              (command "_.dimlinear" p1 p2 "_none" (trans (caddr dim) 0 1))
              (progn
                (command "_.dimbaseline")
                (command p1 p2 "_none" (trans (caddr dim) 0 1))))))))))

;;; 加载提示
(princ "\n合并标注工具已加载,输入 DMRG 启动。")
(princ)

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 昨天 21:28 | 显示全部楼层
你这是拿AI的代码训练大佬呢。自己都不先钻研尝试一下。
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 22:33 | 显示全部楼层
kozmosovia 发表于 2025-5-5 21:28
你这是拿AI的代码训练大佬呢。自己都不先钻研尝试一下。

风趣幽默的
回复 支持 反对

使用道具 举报

发表于 昨天 23:11 | 显示全部楼层
感谢大佬的分享
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
kozmosovia 发表于 2025-5-5 21:28
你这是拿AI的代码训练大佬呢。自己都不先钻研尝试一下。

正确的中肯的一阵见血的
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
就拿这个考验老干部?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-6 11:23 , Processed in 0.195751 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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