明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1725|回复: 13

[函数] lisp怎么获取dcl的key值?(已解决)

[复制链接]
发表于 2023-11-27 17:33:32 | 显示全部楼层 |阅读模式
本帖最后由 陈鱼儿 于 2023-12-7 13:36 编辑

dcl里有个编辑框,想要输入编辑框,在把值给到梨lisp的代码,望大佬指点迷津
以下为lisp代码:
(defun sr2 ()
  (setq in(atoi(get_tile "srsz")))
  )
(defun sr ()
  (setq dcl_id (load_dialog "my_dialog"))
  (if(< dcl_id 0)(exit))
  (if(not(new_dialog "a0" dcl_id))(exit))
  (action_tile "accept" "(sr2)(done_dialog 1)")
  (setq dd(start_dialog))
  (unload_dialog my_dialog)
)
以下为dcl代码:
a0:dialog {
    label = "示例对话框";
    :row {
        :edit_box {
            label = "输入数值:";
            key = "srsz";
            edit_width = 20;
            
        }
    }
    spacer_1;                                //空白一行
        
ok_cancel;

}
发表于 2023-11-27 19:25:27 | 显示全部楼层

获取对话框数值示例代码:read 读取数值
  1. ;以下为对话框程序自动生成:
  2. (defun ngc-dcl()
  3. (setq dcl_file (vl-filename-mktemp nil nil ".dcl"))
  4. (setq f_dcl (open dcl_file "w"))
  5. ;;下面的对话框名称ngc,和下面的对应,可以改成自己的名称,要上下对应:
  6. (write-line "ngc:dialog {" f_dcl)
  7. (write-line "    label = \"春蝉可视化\" ;" f_dcl)
  8. (write-line "    :edit_box {" f_dcl)
  9. (write-line "        edit_width = 20 ;" f_dcl)
  10. (write-line "        key = \"srsz\" ;" f_dcl)
  11. (write-line "        label = \"圆的半径\" ;" f_dcl)
  12. (write-line "    }" f_dcl)
  13. (write-line "    ok_cancel;" f_dcl)
  14. (write-line "}" f_dcl)
  15. (close f_dcl)dcl_file)
  16. ;;主程序开始:-------------------------------
  17. (defun c:tt ()
  18.   (setvar "cmdecho" 0) ;_关闭命令提示
  19.   (setq osmode_bak (getvar "osmode")) ;_记录捕捉
  20.   (setvar "osmode" 0) ;_关闭捕捉
  21.   (setq dcl_id (load_dialog (setq dcl_file (ngc-dcl))));;对话框加载
  22.   (vl-file-delete dcl_file);;加载后删除dcl文件
  23.   (setq chk 0);;设置关键联动默认变量为0
  24.   (new_dialog "ngc" dcl_id);;此处为对话框名称ngc,和上面对应,要上下对应
  25.   (setq keys '("srsz" "accept" "cancel"));对话框key值列表
  26.   (foreach key keys (if (eval (read (strcat key "_bak"))) (set_tile key (eval (read (strcat key "_bak"))))))
  27.   (action_tile "accept" "(setq chk 1)(备份数据)(done_dialog 1)");;确定按钮动作关联
  28.   (start_dialog)
  29.   (读取对话框数据);;此处为读取对话框数据的地方
  30.   (unload_dialog dcl_id)
  31.   (运行程序);;此处为主要程序运行
  32.   (setvar "osmode" osmode_bak) ;_还原捕捉
  33.   (setvar "cmdecho" 1) ;_打开命令提示
  34.   (princ))
  35. (defun 读取对话框数据 ()
  36.   (setq t1 (read srsz_bak)))
  37. (defun 备份数据( / key)(foreach key keys (set (read (strcat key "_bak")) (get_tile key))))
  38. (defun 运行程序 ()
  39.   (if (= chk 1) ;;此处为自定义条件和执行,可以改成其他的关联方式
  40.       (command "circle" (getpoint) t1)))
  41.       ;;程序结束-----------------------------------


直接复制或者下载,代码一样。

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2023-11-28 23:03:41 | 显示全部楼层
shcvip 发表于 2023-11-28 19:29
如果是二行输入需要输入,那上面的DCL怎么写啊

  1. ;以下为对话框程序自动生成:
  2. (defun ngc-dcl()
  3. (setq dcl_file (vl-filename-mktemp nil nil ".dcl"))
  4. (setq f_dcl (open dcl_file "w"))
  5. ;;下面的对话框名称ngc,和下面的对应,可以改成自己的名称,要上下对应:
  6. (write-line "ngc:dialog {" f_dcl)
  7. (write-line "    label = \"春蝉可视化\" ;" f_dcl)
  8. (write-line "    :edit_box {" f_dcl)
  9. (write-line "        edit_width = 20 ;" f_dcl)
  10. (write-line "        key = \"srsz1\" ;" f_dcl)
  11. (write-line "        label = \"圆的半径1\" ;" f_dcl)
  12. (write-line "    }" f_dcl)
  13. (write-line "    :edit_box {" f_dcl)
  14. (write-line "        edit_width = 20 ;" f_dcl)
  15. (write-line "        key = \"srsz2\" ;" f_dcl)
  16. (write-line "        label = \"圆的半径2\" ;" f_dcl)
  17. (write-line "    }" f_dcl)
  18. (write-line "    ok_cancel;" f_dcl)
  19. (write-line "}" f_dcl)
  20. (close f_dcl)dcl_file)
  21. ;;主程序开始:-------------------------------
  22. (defun c:tt ()
  23.   (setvar "cmdecho" 0) ;_关闭命令提示
  24.   (setq osmode_bak (getvar "osmode")) ;_记录捕捉
  25.   (setvar "osmode" 0) ;_关闭捕捉
  26.   (setq dcl_id (load_dialog (setq dcl_file (ngc-dcl))));;对话框加载
  27.   (vl-file-delete dcl_file);;加载后删除dcl文件
  28.   (setq chk 0);;设置关键联动默认变量为0
  29.   (new_dialog "ngc" dcl_id);;此处为对话框名称ngc,和上面对应,要上下对应
  30.   (setq keys '("srsz1" "srsz2" "accept" "cancel"));对话框key值列表
  31.   (foreach key keys (if (eval (read (strcat key "_bak"))) (set_tile key (eval (read (strcat key "_bak"))))))
  32.   (action_tile "accept" "(setq chk 1)(备份数据)(done_dialog 1)");;确定按钮动作关联
  33.   (start_dialog)
  34.   (读取对话框数据);;此处为读取对话框数据的地方
  35.   (unload_dialog dcl_id)
  36.   (运行程序);;此处为主要程序运行
  37.   (setvar "osmode" osmode_bak) ;_还原捕捉
  38.   (setvar "cmdecho" 1) ;_打开命令提示
  39.   (princ))
  40. (defun 读取对话框数据 ()
  41.   (setq t1 (read srsz1_bak)
  42.         t2 (read srsz2_bak))
  43. )
  44. (defun 备份数据( / key)(foreach key keys (set (read (strcat key "_bak")) (get_tile key))))
  45. (defun 运行程序 ()
  46.   (if (= chk 1) ;;此处为自定义条件和执行,可以改成其他的关联方式
  47.       (progn
  48.       (setq pt (getpoint "\n指定圆心画同心圆"))
  49.       (command "circle" pt t1)
  50.       (command "circle" pt t2)
  51. ))
  52. )
  53.       ;;程序结束-----------------------------------
发表于 2023-11-27 18:40:11 | 显示全部楼层
在实务上个人倾向用dos_editbox
(dos_editbox title prompt [default])
发表于 2023-11-28 08:50:00 | 显示全部楼层
本帖最后由 ljfdjjj 于 2023-11-28 08:55 编辑

不用搞子程序,我在群里教过你的,一句话就能搞定。当然你这样写也可以,不过你的这句 (unload_dialog my_dialog)错了,后面的参数不是DCL的文件名,而是DCL文件的id。也就是你前面赋值的那个变量:dcl_id,所以这句应该这么写(unload_dialog dcl_id)。再给你看下我教你的那种写法
  1. (defun c:sr()
  2.   (setq dcl_id (load_dialog "my_dialog"))
  3.   (if(< dcl_id 0)(exit))
  4.   (if(not(new_dialog "a0" dcl_id))(exit))
  5.   (action_tile "accept" "(setq in(atoi(get_tile \"srsz\")))(done_dialog 1)")
  6.   (start_dialog)
  7.   (unload_dialog dcl_id)
  8.   (alert(strcat"你输入的数值是"(itoa in)))
  9. )

本帖子中包含更多资源

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

x
发表于 2023-11-28 09:51:15 | 显示全部楼层
只输入一个。直接用(lisped "缺省值")就行了,没必要折腾DCL
发表于 2023-11-28 10:44:38 | 显示全部楼层
kozmosovia 发表于 2023-11-28 09:51
只输入一个。直接用(lisped "缺省值")就行了,没必要折腾DCL

大佬 我刚才试了一下,那个全屏编辑是啥啊
发表于 2023-11-28 11:03:33 | 显示全部楼层
感谢大佬分享
发表于 2023-11-28 19:29:58 | 显示全部楼层
hhh454 发表于 2023-11-27 19:25
获取对话框数值示例代码:read 读取数值

如果是二行输入需要输入,那上面的DCL怎么写啊
发表于 2023-11-28 23:16:29 | 显示全部楼层

如果对话框,弹出来的时候,就给他一个默认值,这个更完美了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 21:31 , Processed in 0.299176 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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