江湖夜雨 发表于 2025-7-15 13:36:00

求大神帮忙改代码,画矩形记忆上次输入数值

本人不懂编程,利用AI写的一段代码,功能是弹出对话框,初始是空值,输入数据画矩形。最想要的是对话框内可以显示上次输入的数值,不必修改就直接能用。但AI写的无法达到这个目的,它只能显示初始的空值,不能记忆上次的数据。请大神看一下如何修改。代码如下:


(defun c:FFGG (/ *FFGG-data* dcl_id dcl_file length width pt_center result)
;; 声明全局变量(如果不存在则初始化为nil)
(if (not (boundp '*FFGG-data*))
      (setq *FFGG-data* nil)
)

;; 创建临时DCL文件内容
(setq dcl_file (open (strcat (getvar "tempprefix") "ffgg_temp.dcl") "w"))
(write-line "ffgg_dialog : dialog {" dcl_file)
(write-line "label = \"绘制矩形\";" dcl_file)
(write-line ": column {" dcl_file)
(write-line "    : row {" dcl_file)
(write-line "      : edit_box {" dcl_file)
(write-line "      key = \"length\";" dcl_file)
(write-line "      label = \"长度(mm):\";" dcl_file)
(write-line "      edit_width = 10;" dcl_file)
(write-line "      fixed_width = true;" dcl_file)
(write-line "      }" dcl_file)
(write-line "    }" dcl_file)
(write-line "    : row {" dcl_file)
(write-line "      : edit_box {" dcl_file)
(write-line "      key = \"width\";" dcl_file)
(write-line "      label = \"宽度(mm):\";" dcl_file)
(write-line "      edit_width = 10;" dcl_file)
(write-line "      fixed_width = true;" dcl_file)
(write-line "      }" dcl_file)
(write-line "    }" dcl_file)
(write-line "}" dcl_file)
(write-line "ok_cancel;" dcl_file)
(write-line "}" dcl_file)
(close dcl_file)

;; 加载对话框
(setq dcl_id (load_dialog (strcat (getvar "tempprefix") "ffgg_temp.dcl")))
(if (not (new_dialog "ffgg_dialog" dcl_id))
      (progn
      (alert "无法加载对话框!")
      (exit)
      )
)

;; 设置输入框的值(如果有记忆值则使用,否则为空)
(if *FFGG-data*
      (progn
      (set_tile "length" (car *FFGG-data*))
      (set_tile "width" (cadr *FFGG-data*))
      (mode_tile "length" 2);; 设置焦点到长度输入框
      )
      (progn
      (set_tile "length" "")
      (set_tile "width" "")
      (mode_tile "length" 2);; 设置焦点到长度输入框
      )
)

;; 定义按钮动作
(action_tile
    "accept"
    "(progn
       (setq length (get_tile \"length\"))
       (setq width (get_tile \"width\"))
       (done_dialog 1)
   )"
)
(action_tile "cancel" "(done_dialog 0)")

;; 显示对话框
(setq result (start_dialog))
(unload_dialog dcl_id)

;; 删除临时DCL文件
(vl-file-delete (strcat (getvar "tempprefix") "ffgg_temp.dcl"))

;; 处理用户输入
(if (= result 1)
      (progn
      ;; 验证输入是否为数字
      (if (and (numberp (distof length))
               (numberp (distof width))
            )
            (progn
            ;; 更新全局变量(永久记忆)
            (setq *FFGG-data* (list length width))
            ;; 获取鼠标点击位置
            (while (setq pt_center (getpoint "\n指定矩形中心点<退出>: "))
                ;; 绘制矩形
                (draw_centered_rectangle pt_center (distof length) (distof width))
            )
            )
            (alert "错误: 请输入有效的数字!")
      )
      )
)
(princ)
)

;; 绘制中心矩形函数
(defun draw_centered_rectangle (center length width / pt1 pt2 pt3 pt4)
(setq pt1 (list (- (car center) (/ length 2.0)) (- (cadr center) (/ width 2.0))))
(setq pt2 (list (+ (car center) (/ length 2.0)) (- (cadr center) (/ width 2.0))))
(setq pt3 (list (+ (car center) (/ length 2.0)) (+ (cadr center) (/ width 2.0))))
(setq pt4 (list (- (car center) (/ length 2.0)) (+ (cadr center) (/ width 2.0))))

(command "_.pline" "_non" pt1 "_non" pt2 "_non" pt3 "_non" pt4 "_close")
)

;; 加载提示
(princ "\nFFGG命令已加载,输入FFGG绘制矩形。")
(princ)





love1030312 发表于 2025-7-15 14:55:40

按理说 你能操作AI写出这个来也能让他写出记忆参数呀 就是需要多喂几次

xiao1984 发表于 2025-7-15 16:49:14

江湖夜雨 发表于 2025-7-15 15:20
调了很多次,用了一上午时间,就是不行,不能记忆

试试这个,你的要求应该能满足了。

qifeifei 发表于 2025-7-15 13:48:26

把这一段 喂给ai
(defun OFFSET-LINE-PROMPT (from to)
;; 如果 *last-offset* 不存在,则初始化为 10 或者你喜欢的默认值
(if (not *last-offset*)
    (setq *last-offset* 10.0)
)

(initget 6) ; 禁止负数和0
(setq offsetDist (getreal (strcat "\n请输入偏移距离 <" (rtos *last-offset* 2 2) ">: ")))

(if (null offsetDist)
    (setq offsetDist *last-offset*) ; 使用上一次的值
    (setq *last-offset* offsetDist) ; 更新记忆值
)

(if offsetDist
    (OFFSET-LINE from to offsetDist)
    (princ "\n未输入有效数值,操作已取消。"))
)

江湖夜雨 发表于 2025-7-15 15:20:35

love1030312 发表于 2025-7-15 14:55
按理说 你能操作AI写出这个来也能让他写出记忆参数呀 就是需要多喂几次

调了很多次,用了一上午时间,就是不行,不能记忆

qazxswk 发表于 2025-7-15 18:26:31

你一下喂AI这么多,AI消化不了:lol

xiao1984 发表于 2025-7-15 18:53:41

qazxswk 发表于 2025-7-15 18:26
你一下喂AI这么多,AI消化不了

问AI问题也是有技巧和方式的,你如果乱问它就敢给你胡说八道;P

llsheng_73 发表于 2025-7-15 19:37:27

;; 声明全局变量(如果不存在则初始化为nil)
这逻辑就有问题,不存在它本身就是nil,还专门给它初始化为nil。。。
正常应该是如果全局变量不存在(为nil)则用有效数据初始化它,然后用全局变量填写对话框相应的控件值,对话框程序结束前,再把相应的控件值给全局变量,这样就达到了记忆的目的

你有种再说一遍 发表于 2025-7-15 21:33:40

llsheng_73 发表于 2025-7-15 19:37
;; 声明全局变量(如果不存在则初始化为nil)
这逻辑就有问题,不存在它本身就是nil,还专门给它初始化为n ...

如果是C#或者ARX,应该static map[命令, map[变量, 值]],
这样可以序列化存下来,
并且能够实现和 cad系统变量 的双写,防止它们存在差异.

lingfne 发表于 2025-7-15 23:31:37

试一试这个
页: [1] 2
查看完整版本: 求大神帮忙改代码,画矩形记忆上次输入数值