明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 227|回复: 9

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

[复制链接]
发表于 昨天 13:36 | 显示全部楼层 |阅读模式
本人不懂编程,利用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)





本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 昨天 16:49 | 显示全部楼层
江湖夜雨 发表于 2025-7-15 15:20
调了很多次,用了一上午时间,就是不行,不能记忆

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

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 13:48 | 显示全部楼层
把这一段 喂给ai
  1. (defun OFFSET-LINE-PROMPT (from to)
  2.   ;; 如果 *last-offset* 不存在,则初始化为 10 或者你喜欢的默认值
  3.   (if (not *last-offset*)
  4.     (setq *last-offset* 10.0)
  5.   )
  6.   
  7.   (initget 6) ; 禁止负数和0
  8.   (setq offsetDist (getreal (strcat "\n请输入偏移距离 <" (rtos *last-offset* 2 2) ">: ")))
  9.   
  10.   (if (null offsetDist)
  11.     (setq offsetDist *last-offset*) ; 使用上一次的值
  12.     (setq *last-offset* offsetDist) ; 更新记忆值
  13.   )

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

回复 支持 反对

使用道具 举报

发表于 昨天 14:55 | 显示全部楼层
按理说 你能操作AI写出这个来  也能让他写出记忆参数呀 就是需要多喂几次
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 15:20 | 显示全部楼层
love1030312 发表于 2025-7-15 14:55
按理说 你能操作AI写出这个来  也能让他写出记忆参数呀 就是需要多喂几次

调了很多次,用了一上午时间,就是不行,不能记忆
回复 支持 反对

使用道具 举报

发表于 昨天 18:26 | 显示全部楼层
你一下喂AI这么多,AI消化不了
回复 支持 反对

使用道具 举报

发表于 昨天 18:53 | 显示全部楼层
qazxswk 发表于 2025-7-15 18:26
你一下喂AI这么多,AI消化不了

问AI问题也是有技巧和方式的,你如果乱问它就敢给你胡说八道
回复 支持 反对

使用道具 举报

发表于 昨天 19:37 | 显示全部楼层
;; 声明全局变量(如果不存在则初始化为nil)
这逻辑就有问题,不存在它本身就是nil,还专门给它初始化为nil。。。
正常应该是如果全局变量不存在(为nil)则用有效数据初始化它,然后用全局变量填写对话框相应的控件值,对话框程序结束前,再把相应的控件值给全局变量,这样就达到了记忆的目的
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 昨天 23:31 | 显示全部楼层
试一试这个

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 06:34 , Processed in 0.206734 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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