kozmosovia 发表于 2025-8-22 17:05:41

fangmin723 发表于 2025-8-22 16:21
可以设置个按键,用与输入字高用,按下按键后,直接getreal获取字高,就不受10以下的数值限制,再设置三 ...

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

amook147 发表于 2025-8-22 17:39:26

飞雪神光 发表于 2025-8-22 15:46


大佬代码能发下吗我用AI写出来总是有BUG各种各样的BUG

飞雪神光 发表于 2025-8-22 19:49:31

amook147 发表于 2025-8-22 17:39
大佬代码能发下吗我用AI写出来总是有BUG各种各样的BUG





amook147 发表于 2025-8-22 20:05:46

飞雪神光 发表于 2025-8-22 19:49


感谢。。。:handshake

amook147 发表于 2025-8-22 20:27:08

本帖最后由 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)
)

bai2000 发表于 2025-8-22 20:55:10

(goto 'cleanup),是什么???

amook147 发表于 2025-8-22 20:56:36

bai2000 发表于 2025-8-22 20:55
(goto 'cleanup),是什么???

不知道 AI写的反正能用就行 。。{:1_1:}

xyp1964 发表于 2025-8-24 00:23:28

这种效果?


amook147 发表于 2025-8-24 09:15:16

xyp1964 发表于 2025-8-24 00:23
这种效果?

感谢 差不多就是这样已经解决了。。。
页: 1 [2]
查看完整版本: 帮我看看这个文字插入如何能跟随光标移动代码如何修改下?