明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[讨论] 帮我看看这个文字插入如何能跟随光标移动代码如何修改下?

[复制链接]
发表于 昨天 17:05 | 显示全部楼层
fangmin723 发表于 2025-8-22 16:21
可以设置个按键,用与输入字高用,按下按键后,直接getreal获取字高,就不受10以下的数值限制,再设置三 ...

“我想要的效果是 直接输入3就是3号字高  输入5就是5号字高”
他要的不是要设置具体字高多少,而是在预设好的一系列高度中切换选用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 17:39 | 显示全部楼层

大佬  代码能发下吗  我用AI  写出来总是有BUG  各种各样的BUG
回复 支持 反对

使用道具 举报

发表于 昨天 19:49 | 显示全部楼层
amook147 发表于 2025-8-22 17:39
大佬  代码能发下吗  我用AI  写出来总是有BUG  各种各样的BUG





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:05 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:27 | 显示全部楼层
本帖最后由 amook147 于 2025-8-22 20:28 编辑
自己尝试着修改了一下  可以用了。。。  不过+  -号修改字高的功能没加上  我用不到 。。。还是感谢大佬的提醒。。。
(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)
)
回复 支持 反对

使用道具 举报

发表于 昨天 20:55 | 显示全部楼层
(goto 'cleanup),是什么???
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:56 | 显示全部楼层
bai2000 发表于 2025-8-22 20:55
(goto 'cleanup),是什么???

不知道 AI写的  反正能用就行 。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-23 23:13 , Processed in 0.166778 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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