乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 67|回复: 12

[编程交流] DC中取消按钮出错

[复制链接]

9

主题

18

帖子

9

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 14:20:07 | 显示全部楼层 |阅读模式
谁能告诉我哪里出错了。我对lisp很陌生,对DCL也很陌生。一位同事帮了我,我也阅读了李的网站和阿芙拉Lisp程序的网站,让我达到这一点,但现在我有点卡住了。
每次我点击“取消”按钮都会出现这个错误
 
; 错误:错误的参数类型:consp“已取消”
 
最终目标是当点击取消按钮时,它将取消对话并打印一条消息“已被用户取消”
 
Lisp如下所示
DCL如下所示
  1. //---------------------------------//
  2. cbut
  3.    : retirement_button
  4.    {
  5.    alignment     = centered ;
  6.    key           = "cancel" ;
  7.    label         = "Cancel" ;
  8.    is_cancel    = true ;
  9.    fixed_width     = true ;
  10.    width         = 12 ;
  11.    }
  12. okbut
  13.    : retirement_button
  14.    {
  15.    alignment     = centered ;
  16.    key           = "accept" ;
  17.    label         = "Update" ;
  18.    is_default     = true ;
  19.    fixed_width     = true ;
  20.    width         = 12 ;
  21.    }
  22. edbox
  23.    : edit_box
  24.    {
  25.    fixed_width    = true;
  26.    edit_width     = 6;
  27.    }
  28. //---------------------------------//
  29. tile_a
  30.    :boxed_column
  31.    {
  32.    label = "Defaults" ;
  33.    :edbox {key = "eb1"; label = "Timber length"; alignment = right;}
  34.    :edbox {key = "eb2"; label = "Ply Length"; alignment = right;}
  35.    }
  36. //---------------------------------//
  37. Materials
  38.    : dialog
  39.    {
  40.    fixed_width = true;
  41.    width = 40;
  42.    label = "Materials";
  43. tile_a;
  44. cbut;
  45. okbut;
  46. }
  47. //---------------------------------//

提前感谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 14:27:08 | 显示全部楼层
我不是dcl方面的专家,但ok\u cancel组合返回变量“cancel”,因此无论单击ok还是cancel,都可以保存这两个答案,并在dcl之外执行if。问题可能在于dcl内部做了很多工作。您似乎没有保存对这些按钮的单击。
 
这只是我做这件事的一个例子。Ps我需要将取消添加到我的代码中。
  1. (setq dcl_id (load_dialog  fname))
  2. (if (not (new_dialog "ddgetval2" dcl_id))
  3. (exit))
  4. (mode_tile "key1" 3)
  5. (set_tile "key1" (setq val1 def1))
  6. (action_tile "key1" "(setq val1 $value)")
  7. (mode_tile "key2" 3)
  8. (set_tile "key2" (setq val2 def2))
  9. (action_tile "key2" "(setq val2 $value)")
  10. ; put the action tile ok and cancel here as a saved variable
  11. (action_tile "cancel" "(setq action "Yes")")
  12. (start_dialog)
  13. (done_dialog)
  14. (unload_dialog dcl_id)
  15. ; returns the value of val1 and val2 as strings
  16. (vl-file-delete fname)
  17. )
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 14:34:03 | 显示全部楼层
  1. (defun c:Material-sizes  () ;Get Initial Values if set to nil
  2. (if (= timber_length nil) (setq timber_length "4800"))
  3. (if (= Ply_length nil) (setq Ply_length "2400"))
  4. (defun DControl  ()
  5.    (setq dcl-id (load_dialog (findfile "Materials.dcl")))
  6.    (if (not (new_dialog "Materials" dcl-id "" '(-1 -1)))
  7.      (exit)
  8.      (progn (setq Output "Canceled")
  9.             (set_tile "eb1" timber_length)
  10.             (set_tile "eb2" Ply_length)
  11.             (action_tile "accept" "(result)(done_dialog 1)")
  12.             (action_tile "cancel" "(done_dialog 0)")
  13.             (defun result () (setq Output (list "v1.0" (get_tile "eb1") (get_tile "eb2"))))
  14.             (start_dialog)
  15.      )
  16.    )
  17.    Output
  18. )
  19. (setq Output (DControl))
  20. (if (not (eq Output "Canceled"))
  21.    (progn
  22.      (setq timber_length (atof (nth 1 Output))
  23.            Ply_length    (atof (nth 2 Output))) ;Do the calculations
  24.      ;This lengthy section has been removed
  25.      ;reset Variables to strings
  26.      (setq timber_length (rtos timber_length 2 2))
  27.      (setq Ply_length (rtos Ply_length 2 2))
  28.     )
  29.    (princ "\nCanceled by User")
  30.   )
  31. ;clean exit
  32. (princ)
  33. )

 
不管好坏
  1. Materials : dialog {label="Materials";fixed_width=true;width=40;
  2. :boxed_row {label="Defaults";
  3.    :column {:text {label="Timber Length";} :text {label="Ply Length";}}
  4.    :column {:edit_box {key="eb1";} :edit_box {key="eb2";}}}
  5. ok_cancel;
  6. }
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 14:35:38 | 显示全部楼层
基本上,在DControl中,将结果设置为“cancelled”,如果平铺命中为accept,则在result函数中覆盖它。如果您点击cancel(因此跳过覆盖),存储的值仍然是字符串“Cancelled”,当您尝试获取字符串(第n个1个输出)时会触发错误。一个简单的修改是检查变量是否包含列表,如果不包含列表,则在显示您想要的字符串(即“用户已取消”)后退出
干杯!
编辑:我刚刚看到rlx提供了一个有效的解决方案。。。我仍然会留下我的回答,因为最初的问题是“为什么……”。  
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 14:43:14 | 显示全部楼层
只是吹毛求疵,但:
  1. ;;This
  2. (if (= timber_length nil)
  3.   (setq timber_length "4800")
  4. )
  5. (if (= ply_length nil)
  6.   (setq ply_length "2400")
  7. )
  8. ;; Could be this
  9. (or timber_length (setq timber_length "4800"))
  10. (or ply_length (setq ply_length "2400"))
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 14:49:19 | 显示全部楼层
或者:
  1. (setq timber_length (cond ( timber_length ) ( "4800") ) )
  2. (setq Ply_length (cond ( Ply_length ) ( "2400") ) )
甚至:
  1. ; (mapcar 'AssignFirstVal '((timber_length "4800")(Ply_length "2400")))
  2. ; (mapcar 'AssignFirstVal '((a 1)(b 2)(c 3)))
  3. ; (AssignFirstVal '(x 123))
  4. (defun AssignFirstVal ( L / sym val )
  5.   (mapcar 'set '(sym val) L)
  6.   (set sym (cond ( (eval sym) ) ( val ) ) )
  7. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 14:51:24 | 显示全部楼层
为什么将变量的值设置为自身?怎么样-
  1. 9
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 14:57:44 | 显示全部楼层
李在这里有一个很好的观点。尽管如此,对于普通用户来说,当这样声明变量时,很难发现所有变量以将其本地化。
如果有人写信
下一个逻辑步骤是
此后,正如ronjonp所提到的那样,or方法看起来像是一个OP可以理解的概念,并带来了新材料。我不确定OP是否能够掌握使用mapcars/set/eval的概念,因为最初的帮助请求是为了找出原因(第1步)“calcelled”)正在轰炸。挑剔的东西太多了
152008mztc2np6pvzpsinc.png
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 15:01:13 | 显示全部楼层
确实有点愚蠢,但现在来看,这条线可以用or函数缩小一点,就像罗恩做的一样-
谈谈AssignFirstVal子对象
 
我同意,但据我所知,其目的是将木材长度和铺层长度保持在全球范围内
 
没有人需要他来理解使用这些函数的subfo。唯一需要做的就是知道它的作用:
  1. 13
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 15:07:40 | 显示全部楼层
没有人提到这一点:
标准做法是使用start_dialog函数的返回值来确定用于关闭对话框的按钮(或其他互动程序)。返回值将是在done\u对话框调用中指定的整数。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 23:30 , Processed in 1.329403 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表