dmxcs 发表于 2025-11-8 10:36:47

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

dmxcs 发表于 2025-11-8 10:38:04

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 ...

可以输入指定前缀
页: 1 [2]
查看完整版本: 求帮助改编求最大值最小插件