【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 于 2025-12-12 11:12 编辑
学习了新的代码
好的、已删除。 谢谢分享原码,太强大了 谢谢分享原码,太强大了 让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)
) ; 结束子函数 qifeifei 发表于 2025-12-11 19:27
学习了楼主的代码;魔改下了下 改为了自己需要的。
我的所有源码已经露出,不建议收费
页:
[1]