本帖最后由 amook147 于 2025-8-22 10:23 编辑
  1. <div class="blockcode"><blockquote>(vl-load-com)

  2. ; 存储上次使用的参数
  3. (if (not (boundp '*shijian-last-height*))
  4.     (setq *shijian-last-height* 3.0)
  5. )

  6. ; 获取当前日期(确保月份不带前导零,如 2025-8-13)
  7. (defun get-current-date ()
  8.     (setq date-str (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD)"))
  9.     (if (>= (strlen date-str) 10)  ; 确保格式正确
  10.         (strcat (substr date-str 1 5)   ; "YYYY-"
  11.                 (if (= (substr date-str 6 1) "0")  ; 检查前导零
  12.                     (substr date-str 7 1)         ; 去掉 "0"
  13.                     (substr date-str 6 2)         ; 否则保留(如 "10")
  14.                 )
  15.                 (substr date-str 8)     ; "-DD"
  16.         )
  17.         date-str  ; 如果格式异常,返回原字符串
  18.     )
  19. )

  20. ; 主命令函数
  21. (defun c:sj (/ pt ht txt mode price default-price)
  22.     (princ "\n★ 日期价格标注工具 ★")
  23.    
  24.     ; 1. 选择标注类型
  25.     (initget "1 2 3")
  26.     (setq mode (getkword "\n选择类型 [口模(1)/整套(2)/空(3)] <3>: "))
  27.     (if (not mode) (setq mode "3")) ; 默认选3
  28.    
  29.     ; 2. 根据类型设置不同的默认价格(现在先输入价格)
  30.     (if (/= mode "3")
  31.         (progn
  32.             ; 设置默认价格:口模400,整套1300
  33.             (setq default-price (if (= mode "1") "400" "1300"))
  34.             (setq price (getstring (strcat "\n输入价格 <" default-price ">: ")))
  35.             (if (= price "") (setq price default-price)) ; 使用默认价格如果未输入
  36.         )
  37.     )
  38.    
  39.     ; 3. 设置字高(现在在价格之后输入字高)
  40.     (setq ht (getreal (strcat "\n输入字高 <" (rtos *shijian-last-height* 2 1) ">: ")))
  41.     (if (not ht)
  42.         (setq ht *shijian-last-height*)
  43.         (setq *shijian-last-height* ht)
  44.     )
  45.    
  46.     ; 4. 生成文本内容
  47.     (setq txt (if (= mode "3")
  48.                 (get-current-date)
  49.                 (strcat (get-current-date) " "
  50.                        (if (= mode "1") "口模" "整套")
  51.                        "-----价格:" price)
  52.                )
  53.     )
  54.    
  55.     ; 5. 获取插入点并创建文字
  56.     (if (setq pt (getpoint "\n指定插入点 <退出>: "))
  57.         (command "_.-mtext" "_non" pt "_J" "_TL"
  58.                 "_H" (rtos ht 2 1) "_R" "0" "_W" "0" txt "")
  59.     )
  60.    
  61.     (princ)
  62. )


自己用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号 ...

如果无法播放,请点击此处在新窗口打开


网友答: 你这个需求要用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以下的数值限制,再设置三个按键,用于按增量增加和减小文字大小,还有一个用于设置增量的值
  • 上一篇:小白请教一下,lsp格式的插件和编译后的fas的插
  • 下一篇:没有了