kucha007 发表于 4 天前

【TT】仿天正插入单行文字

本帖最后由 kucha007 于 2025-12-11 18:40 编辑

比例和CAD标注比例保持一致


;按比例插入文字Global:AllDimSca
(defun C:TT ( / CurDoc OLD_CMD UcsFlag TmpPT)
(setq CurDoc (vla-get-activedocument (vlax-get-acad-object)))
(setq OLD_CMD (getvar "cmdecho"))
(defun *error* (x);出错函数
    (if OLD_CMD (setvar "cmdecho" OLD_CMD)) ;参数恢复
    (vla-endundomark CurDoc);错误时结束编组
)
(while (eq 8 (logand 8 (getvar 'undoctl)))
      (vla-endundomark CurDoc)
);关闭以前的编组
(vla-startundomark CurDoc);记录编组
    (setvar "cmdecho" 0)
    (if (not UcsFlag) (setq UcsFlag T));默认跟随UCS
    (setq Global:AllDimSca
      (if (and (not Global:AllDimSca)(equal (getvar "DIMSCALE") 1.0 1e-6))
            (setvar "DIMSCALE" 50)
            (getvar "DIMSCALE")
      )
    );默认标注比例
    (setq Global:AllDimSca
            (if (and (eq (getvar "TILEMODE") 0)(eq (getvar "CVPORT") 1));布局空间
                1
                Global:AllDimSca
            )
    )
    (while ;get*
      (progn
      (initget (+ 2 4) "H S") ;非零非负关键词
      (setq TmpPT (getpoint (strcat "\n→请指定文字插入点["
                              (if UcsFlag "跟随坐标(H)" "始终水平(H)")
                              "/比例(S)_" (rtos Global:AllDimSca 2 1) "]")))
      (cond
          ((and TmpPT (eq (type TmpPT) 'LIST));指定了点
            (entmakeX
            (list
                  (cons 0 "TEXT")
                  ;(cons 62 256);随层
                  (cons 10 (trans TmpPT 1 0))
                  (cons 11 (trans TmpPT 1 0))
                  
                  (cons 72 1);水平居中
                  (cons 73 2);垂直居中
                  (cons 1 (getvar "CLAYER"));标注图层名
                  (cons 40 (* Global:AllDimSca 3.5));字高
                  (cons 50
                  (if UcsFlag
                        (angle '(0 0 0)(trans (getvar 'UCSXDIR) 0 (trans '(0 0 1) 1 0 T)));跟随UCS
                        (- (* 2 pi) (getvar "viewtwist"));始终水平
                  )
                  )
            )
            );单行提示文字
            T ;继续循环
          )
          ((and (eq (type TmpPT) 'STR)(eq (strcase TmpPT) "H"));字母H
            (setq UcsFlag (not UcsFlag))
            T ;继续循环
          )
          ((and (eq (type TmpPT) 'STR)(eq (strcase TmpPT) "S"));字母S
            (progn
            (initget (+ 2 4));非零非负值
            (setq Global:AllDimSca (cond
                        ((getreal (strcat "\n→请输入标注比例:<" (rtos Global:AllDimSca 2 2) ">")))
                        (Global:AllDimSca)
                        )
            )
            )
            (setvar "DIMSCALE" Global:AllDimSca) ;CAD标注比例因子
            T ;继续循环
          )
          (T Nil );退出循环
      )
      )
    )
    (setvar "cmdecho" OLD_CMD)
(vla-endundomark CurDoc);结束编组
(princ)
)

qifeifei 发表于 4 天前

本帖最后由 qifeifei 于 2025-12-12 11:12 编辑

学习了新的代码

qifeifei 发表于 3 天前

好的、已删除。

lxl217114 发表于 3 天前

谢谢分享原码,太强大了

tranque 发表于 3 天前

谢谢分享原码,太强大了

tranque 发表于 3 天前

让AI加了个修改文字对齐方式的功能
; 主函数定义 - 按比例插入单行文字
(defun C:FTT (/ CurDoc OLD_CMD UcsFlag TmpPT AlignMode)
;; 加载ActiveX支持
(vl-load-com)

;; 获取当前文档对象
(setq CurDoc (vla-get-activedocument (vlax-get-acad-object)))
;; 保存当前命令回显状态
(setq OLD_CMD (getvar "cmdecho"))

;; 错误处理函数
(defun *error* (msg)
    (if OLD_CMD
      (setvar "cmdecho" OLD_CMD)
    ) ; 恢复命令回显
    (vla-endundomark CurDoc) ; 结束撤销编组
    (princ)
) ; 结束错误处理函数

;; 清理可能存在的未结束编组
(while (eq 8 (logand 8 (getvar 'undoctl)))
    (vla-endundomark CurDoc)
) ; 结束while循环

;; 开始新的撤销编组
(vla-startundomark CurDoc)
;; 关闭命令回显
(setvar "cmdecho" 0)

;; 初始化变量
(if (not UcsFlag) (setq UcsFlag T)) ; UCS跟随标志
(if (not AlignMode) (setq AlignMode 0)) ; 对齐方式:0=左对齐,1=居中,2=右对齐

;; 设置默认标注比例
(setq Global:AllDimSca
    (if (and (not Global:AllDimSca) (equal (getvar "DIMSCALE") 1.0 1e-6))
      (setvar "DIMSCALE" 50) ; 如果未设置且当前为1.0,则设为50
      (getvar "DIMSCALE") ; 否则使用当前值
    ) ; 结束if
) ; 结束setq

;; 在布局空间中固定比例为1
(setq Global:AllDimSca
    (if (and (eq (getvar "TILEMODE") 0) (eq (getvar "CVPORT") 1))
      1 ; 布局空间固定为1
      Global:AllDimSca ; 模型空间使用设定值
    ) ; 结束if
) ; 结束setq

;; 主循环 - 获取用户输入
(while
    (progn
      ;; 设置输入选项:2=禁止零值,4=禁止负值
      (initget (+ 2 4) "H S A")
      
      ;; 获取对齐方式描述字符串
      (setq align_desc (get_align_desc AlignMode))
      
      ;; 构建提示字符串
      (setq TmpPT
      (getpoint
          (strcat
            "\n→请指定文字插入点["
            (if UcsFlag
            "跟随坐标(H)"; UCS跟随模式
            "始终水平(H)"; 水平模式
            ) ; 结束if
            "/比例(S)_" (rtos Global:AllDimSca 2 1)
            "/" align_desc "(A)" ; 显示当前对齐方式
            "]"
          ) ; 结束strcat
      ) ; 结束getpoint
      ) ; 结束setq
      
      ;; 处理用户输入
      (cond
      ;; 情况1:用户指定了点
      ((and TmpPT (eq (type TmpPT) 'LIST))
          (insert_aligned_text TmpPT UcsFlag Global:AllDimSca AlignMode) ; 调用子函数插入文字
          T ; 继续循环
      ) ; 结束情况1
      
      ;; 情况2:用户输入H(切换对齐模式)
      ((and (eq (type TmpPT) 'STR) (eq (strcase TmpPT) "H"))
          (setq UcsFlag (not UcsFlag)) ; 切换标志
          T ; 继续循环
      ) ; 结束情况2
      
      ;; 情况3:用户输入S(修改比例)
      ((and (eq (type TmpPT) 'STR) (eq (strcase TmpPT) "S"))
          (set_scale) ; 调用子函数设置比例
          T ; 继续循环
      ) ; 结束情况3
      
      ;; 情况4:用户输入A(切换对齐方式)
      ((and (eq (type TmpPT) 'STR) (eq (strcase TmpPT) "A"))
          (setq AlignMode (cycle_align_mode AlignMode)) ; 循环切换对齐方式
          T ; 继续循环
      ) ; 结束情况4
      
      ;; 默认情况:退出循环
      (T nil)
      ) ; 结束cond
    ) ; 结束progn
) ; 结束while

;; 恢复命令回显状态
(setvar "cmdecho" OLD_CMD)
;; 结束撤销编组
(vla-endundomark CurDoc)
;; 静默退出
(princ)
) ; 结束主函数

;; 子函数:获取对齐方式描述
(defun get_align_desc (mode)
(cond
    ((= mode 0) "左对齐")
    ((= mode 1) "居中")
    ((= mode 2) "右对齐")
    ((= mode 3) "正中")
    (T "未知")
) ; 结束cond
) ; 结束子函数

;; 子函数:循环切换对齐方式
(defun cycle_align_mode (current_mode)
;; 循环算法:0->1->2->3->0
(setq new_mode (+ current_mode 1)) ; 增加1
(if (= new_mode 4) ; 如果达到4
    (setq new_mode 0) ; 重置为0
) ; 结束if
new_mode ; 返回新值
) ; 结束子函数

;; 子函数:插入对齐文字
(defun insert_aligned_text (ins_pt ucs_flag scale_factor align_mode)
;; 获取当前图层名
(setq layer_name (getvar "CLAYER"))
;; 计算文字高度
(setq text_height (* scale_factor 3.5))

;; 计算旋转角度
(setq rotation_angle
    (if ucs_flag
      ;; 跟随UCS方向
      (angle
      '(0 0 0)
      (trans (getvar 'UCSXDIR) 0 (trans '(0 0 1) 1 0 T))
      ) ; 结束angle
      ;; 始终水平
      (- (* 2 pi) (getvar "viewtwist"))
    ) ; 结束if
) ; 结束setq

;; 根据对齐模式设置组码72和73
;; 72=水平对齐,73=垂直对齐
(cond
    ;; 左对齐
    ((= align_mode 0)
      (setq horiz_just 0); 0=左对齐
      (setq vert_just 0)   ; 0=基线对齐
    ) ; 结束左对齐
   
    ;; 居中
    ((= align_mode 1)
      (setq horiz_just 1); 1=居中
      (setq vert_just 2)   ; 2=中心对齐
    ) ; 结束居中
   
    ;; 右对齐
    ((= align_mode 2)
      (setq horiz_just 2); 2=右对齐
      (setq vert_just 0)   ; 0=基线对齐
    ) ; 结束右对齐
   
    ;; 正中
    ((= align_mode 3)
      (setq horiz_just 1); 1=居中
      (setq vert_just 2)   ; 2=中心对齐
    ) ; 结束正中
) ; 结束cond

;; 创建文字实体
(entmake
    (list
      '(0 . "TEXT")         ; 实体类型
      (cons 10 (trans ins_pt 1 0)) ; 插入点(转换为WCS)
      (cons 11 (trans ins_pt 1 0)) ; 对齐点
      (cons 40 text_height); 文字高度
      (cons 1 layer_name)    ; 文字内容(使用图层名)
      (cons 50 rotation_angle) ; 旋转角度
      (cons 72 horiz_just)   ; 水平对齐方式
      (cons 73 vert_just)    ; 垂直对齐方式
      (cons 62 256)          ; 颜色:256=随层
    ) ; 结束list
) ; 结束entmake
) ; 结束子函数

;; 子函数:设置比例
(defun set_scale ()
;; 获取新比例值
(initget (+ 2 4)) ; 非零非负
(setq new_scale
    (cond
      ((getreal
      (strcat
          "\n→请输入标注比例:<"
          (rtos Global:AllDimSca 2 2) ; 显示当前值
          ">"
      ) ; 结束strcat
      )) ; 结束getreal
      (Global:AllDimSca) ; 回车则保持原值
    ) ; 结束cond
) ; 结束setq

;; 更新全局变量和系统变量
(setq Global:AllDimSca new_scale)
(setvar "DIMSCALE" Global:AllDimSca)
) ; 结束子函数

kucha007 发表于 3 天前

qifeifei 发表于 2025-12-11 19:27
学习了楼主的代码;魔改下了下 改为了自己需要的。

我的所有源码已经露出,不建议收费
页: [1]
查看完整版本: 【TT】仿天正插入单行文字