求大神帮忙改代码,画矩形记忆上次输入数值
本人不懂编程,利用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)
按理说 你能操作AI写出这个来也能让他写出记忆参数呀 就是需要多喂几次 江湖夜雨 发表于 2025-7-15 15:20
调了很多次,用了一上午时间,就是不行,不能记忆
试试这个,你的要求应该能满足了。
把这一段 喂给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未输入有效数值,操作已取消。"))
)
love1030312 发表于 2025-7-15 14:55
按理说 你能操作AI写出这个来也能让他写出记忆参数呀 就是需要多喂几次
调了很多次,用了一上午时间,就是不行,不能记忆 你一下喂AI这么多,AI消化不了:lol qazxswk 发表于 2025-7-15 18:26
你一下喂AI这么多,AI消化不了
问AI问题也是有技巧和方式的,你如果乱问它就敢给你胡说八道;P ;; 声明全局变量(如果不存在则初始化为nil)
这逻辑就有问题,不存在它本身就是nil,还专门给它初始化为nil。。。
正常应该是如果全局变量不存在(为nil)则用有效数据初始化它,然后用全局变量填写对话框相应的控件值,对话框程序结束前,再把相应的控件值给全局变量,这样就达到了记忆的目的 llsheng_73 发表于 2025-7-15 19:37
;; 声明全局变量(如果不存在则初始化为nil)
这逻辑就有问题,不存在它本身就是nil,还专门给它初始化为n ...
如果是C#或者ARX,应该static map[命令, map[变量, 值]],
这样可以序列化存下来,
并且能够实现和 cad系统变量 的双写,防止它们存在差异. 试一试这个
页:
[1]
2