明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: lml2023

[提问] 求帮助改编求最大值最小插件

[复制链接]
发表于 10 小时前 | 显示全部楼层
(defun c:tt22 (/ prefix ss i ent txt num txt-list sorted min-ent max-ent
               min-pt max-pt min-cen max-cen min-rad max-rad ht old-clr
               filtered-txt filter)
  
  (setq old-clr (getvar 'cecolor))
  
  ;;; 正确修复前缀输入空格问题 - 使用 getstring 的 allow-spaces 参数
  (setq prefix (getstring T "\nEnter text prefix (press Enter for all text): "))
  
  ;;; 构建选择集过滤器
  (if (= prefix "")
    (setq filter '((0 . "TEXT"))) ; 如果前缀为空,选择所有文本
    (setq filter (list '(0 . "TEXT") (cons 1 (strcat prefix "*")))) ; 只选择符合前缀的文本
  )
  
  (if (setq ss (ssget filter)) ; 使用过滤器选择文本
    (progn
      (setq i 0 txt-list '())
      (repeat (sslength ss)
        (setq ent (ssname ss i)
              txt (cdr (assoc 1 (entget ent)))
              ht (cdr (assoc 40 (entget ent)))
              filtered-txt txt) ; 初始化为原始文本
        
        ;;; 处理前缀 - 如果前缀不为空,去掉前缀
        (if (/= prefix "")
          (setq filtered-txt (substr txt (+ (strlen prefix) 1)))
        )
        
        ;;; 尝试转换为数字
        (setq num (distof filtered-txt))
        
        ;;; 如果转换失败,尝试去掉可能的前导空格
        (if (not num)
          (setq num (distof (vl-string-trim " " filtered-txt)))
        )
        
        ;;; 如果成功转换为数字,添加到列表
        (if num
          (setq txt-list (cons (list num ent txt ht) txt-list))
        )
        
        (setq i (1+ i))
      )
      
      (if txt-list
        (progn
          (setq sorted (vl-sort txt-list '(lambda (x y) (< (car x) (car y))))
                min-ent (cadar sorted)
                max-ent (cadr (last sorted))
                min-ht (cadddr (car sorted))
                max-ht (cadddr (last sorted)))
         
          ;;; 处理最小值文本 - 用绿色圈
          (vla-getboundingbox (vlax-ename->vla-object min-ent) 'min-pt 'max-pt)
          (setq min-pt (vlax-safearray->list min-pt)
                max-pt (vlax-safearray->list max-pt)
                min-cen (mapcar '(lambda (a b) (* (+ a b) 0.5)) min-pt max-pt)
                min-rad (+ (* (distance min-pt max-pt) 0.5) (* min-ht 0.5)))
         
          ;;; 处理最大值文本 - 用红色圈
          (vla-getboundingbox (vlax-ename->vla-object max-ent) 'min-pt 'max-pt)
          (setq min-pt (vlax-safearray->list min-pt)
                max-pt (vlax-safearray->list max-pt)
                max-cen (mapcar '(lambda (a b) (* (+ a b) 0.5)) min-pt max-pt)
                max-rad (+ (* (distance min-pt max-pt) 0.5) (* max-ht 0.5)))
         
          ;;; 绘制圆圈 - 最小值用绿色,最大值用红色
          (setvar 'cecolor "3") ; 绿色 - 最小值
          (command "_.circle" min-cen min-rad)
         
          (setvar 'cecolor "1") ; 红色 - 最大值
          (command "_.circle" max-cen max-rad)
         
          ;;; 显示结果
          (princ (strcat "\nMin value: " (caddr (car sorted))
                        "  Max value: " (caddr (last sorted))))
          (princ (strcat "\nNumeric range: " (rtos (caar sorted))
                        " - " (rtos (car (last sorted)))))
        )
        (princ "\nNo valid numeric text found!")
      )
    )
    (princ "\nNo text objects selected!")
  )
  
  (setvar 'cecolor old-clr)
  (princ)
)
回复 支持 反对

使用道具 举报

发表于 10 小时前 | 显示全部楼层
dmxcs 发表于 2025-11-8 10:36
(defun c:tt22 (/ prefix ss i ent txt num txt-list sorted min-ent max-ent
               min-pt max ...

可以输入指定前缀
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-8 21:29 , Processed in 0.163852 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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