DC中取消按钮出错
谁能告诉我哪里出错了。我对lisp很陌生,对DCL也很陌生。一位同事帮了我,我也阅读了李的网站和阿芙拉Lisp程序的网站,让我达到这一点,但现在我有点卡住了。每次我点击“取消”按钮都会出现这个错误
; 错误:错误的参数类型:consp“已取消”
最终目标是当点击取消按钮时,它将取消对话并打印一条消息“已被用户取消”
Lisp如下所示
DCL如下所示
//---------------------------------//
cbut
: retirement_button
{
alignment = centered ;
key = "cancel" ;
label = "Cancel" ;
is_cancel = true ;
fixed_width = true ;
width = 12 ;
}
okbut
: retirement_button
{
alignment = centered ;
key = "accept" ;
label = "Update" ;
is_default = true ;
fixed_width = true ;
width = 12 ;
}
edbox
: edit_box
{
fixed_width = true;
edit_width = 6;
}
//---------------------------------//
tile_a
:boxed_column
{
label = "Defaults" ;
:edbox {key = "eb1"; label = "Timber length"; alignment = right;}
:edbox {key = "eb2"; label = "Ply Length"; alignment = right;}
}
//---------------------------------//
Materials
: dialog
{
fixed_width = true;
width = 40;
label = "Materials";
tile_a;
cbut;
okbut;
}
//---------------------------------//
提前感谢 我不是dcl方面的专家,但ok\u cancel组合返回变量“cancel”,因此无论单击ok还是cancel,都可以保存这两个答案,并在dcl之外执行if。问题可能在于dcl内部做了很多工作。您似乎没有保存对这些按钮的单击。
这只是我做这件事的一个例子。Ps我需要将取消添加到我的代码中。
(setq dcl_id (load_dialogfname))
(if (not (new_dialog "ddgetval2" dcl_id))
(exit))
(mode_tile "key1" 3)
(set_tile "key1" (setq val1 def1))
(action_tile "key1" "(setq val1 $value)")
(mode_tile "key2" 3)
(set_tile "key2" (setq val2 def2))
(action_tile "key2" "(setq val2 $value)")
; put the action tile ok and cancel here as a saved variable
(action_tile "cancel" "(setq action "Yes")")
(start_dialog)
(done_dialog)
(unload_dialog dcl_id)
; returns the value of val1 and val2 as strings
(vl-file-delete fname)
)
(defun c:Material-sizes() ;Get Initial Values if set to nil
(if (= timber_length nil) (setq timber_length "4800"))
(if (= Ply_length nil) (setq Ply_length "2400"))
(defun DControl()
(setq dcl-id (load_dialog (findfile "Materials.dcl")))
(if (not (new_dialog "Materials" dcl-id "" '(-1 -1)))
(exit)
(progn (setq Output "Canceled")
(set_tile "eb1" timber_length)
(set_tile "eb2" Ply_length)
(action_tile "accept" "(result)(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(defun result () (setq Output (list "v1.0" (get_tile "eb1") (get_tile "eb2"))))
(start_dialog)
)
)
Output
)
(setq Output (DControl))
(if (not (eq Output "Canceled"))
(progn
(setq timber_length (atof (nth 1 Output))
Ply_length (atof (nth 2 Output))) ;Do the calculations
;This lengthy section has been removed
;reset Variables to strings
(setq timber_length (rtos timber_length 2 2))
(setq Ply_length (rtos Ply_length 2 2))
)
(princ "\nCanceled by User")
)
;clean exit
(princ)
)
不管好坏
Materials : dialog {label="Materials";fixed_width=true;width=40;
:boxed_row {label="Defaults";
:column {:text {label="Timber Length";} :text {label="Ply Length";}}
:column {:edit_box {key="eb1";} :edit_box {key="eb2";}}}
ok_cancel;
}
基本上,在DControl中,将结果设置为“cancelled”,如果平铺命中为accept,则在result函数中覆盖它。如果您点击cancel(因此跳过覆盖),存储的值仍然是字符串“Cancelled”,当您尝试获取字符串(第n个1个输出)时会触发错误。一个简单的修改是检查变量是否包含列表,如果不包含列表,则在显示您想要的字符串(即“用户已取消”)后退出
干杯!
编辑:我刚刚看到rlx提供了一个有效的解决方案。。。我仍然会留下我的回答,因为最初的问题是“为什么……”。 只是吹毛求疵,但:
;;This
(if (= timber_length nil)
(setq timber_length "4800")
)
(if (= ply_length nil)
(setq ply_length "2400")
)
;; Could be this
(or timber_length (setq timber_length "4800"))
(or ply_length (setq ply_length "2400")) 或者:
(setq timber_length (cond ( timber_length ) ( "4800") ) )
(setq Ply_length (cond ( Ply_length ) ( "2400") ) )甚至:
; (mapcar 'AssignFirstVal '((timber_length "4800")(Ply_length "2400")))
; (mapcar 'AssignFirstVal '((a 1)(b 2)(c 3)))
; (AssignFirstVal '(x 123))
(defun AssignFirstVal ( L / sym val )
(mapcar 'set '(sym val) L)
(set sym (cond ( (eval sym) ) ( val ) ) )
) 为什么将变量的值设置为自身?怎么样-
9 李在这里有一个很好的观点。尽管如此,对于普通用户来说,当这样声明变量时,很难发现所有变量以将其本地化。
如果有人写信
下一个逻辑步骤是
此后,正如ronjonp所提到的那样,or方法看起来像是一个OP可以理解的概念,并带来了新材料。我不确定OP是否能够掌握使用mapcars/set/eval的概念,因为最初的帮助请求是为了找出原因(第1步)“calcelled”)正在轰炸。挑剔的东西太多了 确实有点愚蠢,但现在来看,这条线可以用or函数缩小一点,就像罗恩做的一样-
谈谈AssignFirstVal子对象
我同意,但据我所知,其目的是将木材长度和铺层长度保持在全球范围内
没有人需要他来理解使用这些函数的subfo。唯一需要做的就是知道它的作用:
13 没有人提到这一点:
标准做法是使用start_dialog函数的返回值来确定用于关闭对话框的按钮(或其他互动程序)。返回值将是在done\u对话框调用中指定的整数。
页:
[1]
2