帮我看看这个文字插入如何能跟随光标移动代码如何修改下?
本帖最后由 amook147 于 2025-8-22 10:23 编辑<div class="blockcode"><blockquote>(vl-load-com)
; 存储上次使用的参数
(if (not (boundp '*shijian-last-height*))
(setq *shijian-last-height* 3.0)
)
; 获取当前日期(确保月份不带前导零,如 2025-8-13)
(defun get-current-date ()
(setq date-str (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD)"))
(if (>= (strlen date-str) 10); 确保格式正确
(strcat (substr date-str 1 5) ; "YYYY-"
(if (= (substr date-str 6 1) "0"); 检查前导零
(substr date-str 7 1) ; 去掉 "0"
(substr date-str 6 2) ; 否则保留(如 "10")
)
(substr date-str 8) ; "-DD"
)
date-str; 如果格式异常,返回原字符串
)
)
; 主命令函数
(defun c:sj (/ pt ht txt mode price default-price)
(princ "\n★ 日期价格标注工具 ★")
; 1. 选择标注类型
(initget "1 2 3")
(setq mode (getkword "\n选择类型 [口模(1)/整套(2)/空(3)] <3>: "))
(if (not mode) (setq mode "3")) ; 默认选3
; 2. 根据类型设置不同的默认价格(现在先输入价格)
(if (/= mode "3")
(progn
; 设置默认价格:口模400,整套1300
(setq default-price (if (= mode "1") "400" "1300"))
(setq price (getstring (strcat "\n输入价格 <" default-price ">: ")))
(if (= price "") (setq price default-price)) ; 使用默认价格如果未输入
)
)
; 3. 设置字高(现在在价格之后输入字高)
(setq ht (getreal (strcat "\n输入字高 <" (rtos *shijian-last-height* 2 1) ">: ")))
(if (not ht)
(setq ht *shijian-last-height*)
(setq *shijian-last-height* ht)
)
; 4. 生成文本内容
(setq txt (if (= mode "3")
(get-current-date)
(strcat (get-current-date) " "
(if (= mode "1") "口模" "整套")
"-----价格:" price)
)
)
; 5. 获取插入点并创建文字
(if (setq pt (getpoint "\n指定插入点 <退出>: "))
(command "_.-mtext" "_non" pt "_J" "_TL"
"_H" (rtos ht 2 1) "_R" "0" "_W" "0" txt "")
)
(princ)
)
自己用AI写的插入时间及模具价格的文字小插件。。。
我的想法是能不能在最后输入完价格以后,需要插入的文字就显示在十字光标周围 并且跟随鼠标移动可以实时看到具体文字大小,然后在输入合适的字高,也能方便看到文字插入到哪里合适。。。用AI怎么搞都达不到我要的效果所以来论坛求助各位大神。。
本帖最后由 amook147 于 2025-8-22 20:28 编辑
飞雪神光 发表于 2025-8-22 19:49
自己尝试着修改了一下可以用了。。。不过+-号修改字高的功能没加上我用不到 。。。还是感谢大佬的提醒。。。
(vl-load-com)
; 存储上次使用的参数
(if (not (boundp '*shijian-last-height*))
(setq *shijian-last-height* 5.0)
)
; 获取当前日期(确保月份不带前导零,如 2025-8-13)
(defun get-current-date ()
(setq date-str (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD)"))
(if (>= (strlen date-str) 10); 确保格式正确
(strcat (substr date-str 1 5) ; "YYYY-"
(if (= (substr date-str 6 1) "0"); 检查前导零
(substr date-str 7 1) ; 去掉 "0"
(substr date-str 6 2) ; 否则保留(如 "10")
)
(substr date-str 8) ; "-DD"
)
date-str; 如果格式异常,返回原字符串
)
)
; 确保点是正确的三维点格式
(defun ensure-3d-point (pt)
(cond
((not pt) (list 0.0 0.0 0.0)); 默认点
((= (length pt) 1) (list (car pt) 0.0 0.0))
((= (length pt) 2) (list (car pt) (cadr pt) 0.0))
((= (length pt) 3) pt)
(t (list (car pt) (cadr pt) (caddr pt))); 取前三个值
)
)
; 检查字符串是否为有效的数字
(defun is-number (str)
(if (null str)
nil
(vl-catch-all-apply 'atof (list str))
)
)
; 动态显示文字跟随光标 - 直接输入字高修改
(defun dynamic-preview (txt initial-ht / pt ht result old-cmd old-osmode temp-obj
input key str-buffer)
(setq old-cmd (getvar "cmdecho")
old-osmode (getvar "osmode")
ht initial-ht
temp-obj nil
result nil
str-buffer ""; 用于缓存输入的数字字符
)
; 保存当前系统变量
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(princ "\n===== 预览模式 =====")
(princ "\n- 移动鼠标调整位置")
(princ "\n- 直接输入数字修改字高(按回车确认)")
(princ "\n- 左键点击确定位置")
(princ "\n- ESC或右键取消")
(princ (strcat "\n当前字高: " (rtos ht 2 1)))
; 获取初始光标位置
(setq pt (ensure-3d-point (getvar "cursorpos")))
; 创建临时文字对象
(setq temp-obj
(entmakex
(list
(cons 0 "TEXT")
(cons 1 txt)
(cons 10 pt)
(cons 40 ht)
(cons 50 0.0)
(cons 7 (getvar "textstyle"))
(cons 62 2); 红色预览
)
)
)
(if (not temp-obj)
(progn
(princ "\n无法创建预览文字!")
(goto 'cleanup)
)
)
; 主交互循环 - 支持直接输入数字修改字高
(while (not result)
(setq input (grread nil 15 0))
(cond
; 鼠标移动 (5)
((= (car input) 5)
(setq new-pt (ensure-3d-point (cadr input)))
; 更新文字位置
(entmod (list (cons -1 temp-obj) (cons 10 new-pt)))
(entupd temp-obj)
(redraw)
)
; 键盘输入 (2)
((= (car input) 2)
(setq key (cadr input))
; ESC键取消 (27)
(if (= key 27)
(setq result nil)
; 回车键确认字高输入 (13)
(if (= key 13)
(progn
(if (and (/= str-buffer "") (is-number str-buffer))
(progn
(setq new-ht (atof str-buffer))
(if (> new-ht 0)
(progn
(setq ht new-ht)
; 更新预览文字高度
(entmod (list (cons -1 temp-obj) (cons 40 ht)))
(entupd temp-obj)
(redraw)
(princ (strcat "\n字高已更新为: " (rtos ht 2 1)))
)
(princ "\n无效的字高值,必须大于0")
)
)
(princ "\n未输入有效的数字")
)
(setq str-buffer ""); 清空输入缓存
)
; 退格键删除字符 (8)
(if (= key 8)
(if (/= str-buffer "")
(setq str-buffer (substr str-buffer 1 (- (strlen str-buffer) 1)))
)
; 数字键 (0-9)
(if (and (>= key 48) (<= key 57))
(setq str-buffer (strcat str-buffer (chr key)))
; 小数点 (46)
(if (and (= key 46) (not (wcmatch str-buffer "*.*")))
(setq str-buffer (strcat str-buffer "."))
)
)
)
)
)
; 显示当前输入的字符
(if (/= str-buffer "")
(princ (strcat "\n输入字高: " str-buffer))
)
)
; 左键点击确认 (3)
((= (car input) 3)
(setq result (list (ensure-3d-point (cadr input)) ht))
)
; 右键取消 (2)
((= (car input) 2)
(setq result nil)
)
)
)
cleanup:
; 清理临时对象
(if temp-obj (entdel temp-obj))
(setvar "cmdecho" old-cmd)
(setvar "osmode" old-osmode)
(redraw)
result
)
; 主命令函数
(defun c:sj (/ result pt ht txt mode price default-price)
(princ "\n★ 日期价格标注工具 ★")
; 1. 选择标注类型
(initget "1 2 3")
(setq mode (getkword "\n选择类型 [口模(1)/整套(2)/空(3)] <3>: "))
(if (not mode) (setq mode "3"))
; 2. 输入价格
(if (/= mode "3")
(progn
(setq default-price (if (= mode "1") "400" "1300"))
(setq price (getstring (strcat "\n输入价格 <" default-price ">: ")))
(if (= price "") (setq price default-price))
)
)
; 3. 输入字高
(setq ht (getreal (strcat "\n输入字高 <" (rtos *shijian-last-height* 2 1) ">: ")))
(if (not ht)
(setq ht *shijian-last-height*)
(setq *shijian-last-height* ht)
)
; 4. 生成文本内容
(setq txt (if (= mode "3")
(get-current-date)
(strcat (get-current-date) " "
(if (= mode "1") "口模" "整套")
"-----价格:" price)
)
)
; 5. 进入动态预览
(setq result (dynamic-preview txt ht))
; 6. 创建文字
(if result
(progn
(setq pt (car result)
ht (cadr result)
*shijian-last-height* ht)
(command "_.-mtext" "_non" pt "_J" "_TL"
"_H" (rtos ht 2 1) "_R" "0" "_W" "0" txt "")
(princ (strcat "\n已创建标注,字高: " (rtos ht 2 1)))
)
(princ "\n操作已取消")
)
(princ)
) 飞雪神光 发表于 2025-8-22 11:41
while 搭配grread
感谢但是我不想要实时动态的文字调整 这种太麻烦我想要的效果是 直接输入3就是3号字高输入5就是5号字高 不需要鼠标点击 拉动鼠标调节字高
输入完价格,文字就显示在光标上然后我直接输入字高确认以后,光标上的字高就会变化然后我点击任意位置插入完事。。。 不知道能否实现? amook147 发表于 2025-8-22 12:32
感谢但是我不想要实时动态的文字调整 这种太麻烦我想要的效果是 直接输入3就是3号字高输入5就是5号 ...
attach://144881.flv 你这个需求要用grread 来实现 可以动态调整文字高度 飞雪神光 发表于 2025-8-22 10:39
你这个需求要用grread 来实现 可以动态调整文字高度
那跟随光标移动 用什么函数实现? http://bbs.mjtd.com/forum.php?mod=viewthread&tid=91313&highlight=grread
amook147 发表于 2025-8-22 10:53
那跟随光标移动 用什么函数实现?
while 搭配grread 可以,grread可以监控键盘输入,只要小于10,都不需要回车,输入数字就直接实时改变字高 kozmosovia 发表于 2025-8-22 12:42
可以,grread可以监控键盘输入,只要小于10,都不需要回车,输入数字就直接实时改变字高
哦好的我再试试。。。感谢 本帖最后由 fangmin723 于 2025-8-22 16:26 编辑
kozmosovia 发表于 2025-8-22 12:42
可以,grread可以监控键盘输入,只要小于10,都不需要回车,输入数字就直接实时改变字高
可以设置个按键,用与输入字高用,按下按键后,直接getreal获取字高,就不受10以下的数值限制,再设置三个按键,用于按增量增加和减小文字大小,还有一个用于设置增量的值
页:
[1]
2