DCL检索val的帮助
我决定编写我自己版本的多行输入dcl以满足我们的需要,其思想是dcl的大小基于列表中的项目数,因此这部分效果很好,我最终得到了一个具有默认值的多行dcl。我有它的工作,有一些有趣的事情发生了,所以改变了代码,现在我已经失去了整个工作的东西。重复设置平铺默认值,但平铺不返回该值
任何帮助都将不胜感激。
; InputDialog box with variable title
; multiple lines of dcl input supported
; add extra values to the list
(vl-load-com)
; returns the value of key1 key2 and key3 etcas strings
; sample code (ah:getval2018 "heading at top" (list "Line 1" 5 4 "1" "Line2" 8 7 "2"))
; (setq dcllst (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
; (AH:getval2018 "This is heading" (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
(defunAH:getval2018 (heading dcllst /x y ans fo fname keynum)
(setq num (/ (length dcllst) 4))
(setq x 0)
(setqy 0)
(setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
(write-line "ddgetvalAH : dialog {" fo)
(write-line(strcat " label =" (chr 34) heading (chr 34) " ;" )fo)
(write-line " : column {" fo)
(repeat num
(write-line "spacer_1 ;" fo)
(write-line ": edit_box {" fo)
(setq keynum (strcat "key" (rtos (setq y (+ Y 1)) 2 0)))
(write-line (strcat " key = " (chr 34) keynum (chr 34) ";") fo)
(write-line(strcat " label = "(chr 34) (nth x dcllst) (chr 34) ";" ) fo)
(write-line (strcat " edit_width = " (rtos (nth (+ x 1) dcllst) 2 0) ";" ) fo)
(write-line (strcat " edit_limit = " (rtos (nth (+ x 2) dcllst) 2 0) ";" ) fo)
(write-line " is_enabled = true ;" fo)
(write-line " }" fo)
(setq x (+ x 4))
)
(write-line " }" fo)
(write-line "spacer_1 ;" fo)
(write-line "ok_only;}" fo)
(close fo)
(setq dcl_id (load_dialogfname))
(if (not (new_dialog "ddgetvalAH" dcl_id))
(exit))
(setq x -1)
(setq y 0)
(repeatnum
(setq keynum(strcat "key" (rtos (setq y (+ Y 1)) 2 0)))
(setq valnum (strcat "val" (rtos y 2 0)))
(set_tile keynum (nth (setq x (+ x 4)) dcllst))
;;;; problem is here
(action_tile keynum (strcat "(set " "(read valnum)" " $value)"))
(mode_tilekeynum3)
)
(start_dialog)
(unload_dialog dcl_id)
)
(AH:getval2018 "This is heading" (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44")) 也许是这样,不太确定——它回来了!val1!val2!val3。。。
; sample code (ah:getval2018 "heading at top" (list "Line 1" 5 4 "1" "Line2" 8 7 "2"))
; (setq dcllst (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
; (AH:getval2018 "This is heading" (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
(defun AH:getval2018 ( heading dcllst / x y fo fname keynum valnum keylst vallst )
(setq num (/ (length dcllst) 4))
(setq x 0)
(setq y 0)
(setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
(write-line "ddgetvalAH : dialog {" fo)
(write-line (strcat " label =" (chr 34) heading (chr 34) " ;" ) fo)
(write-line " : column {" fo)
(repeat num
(write-line "spacer_1 ;" fo)
(write-line ": edit_box {" fo)
(setq keynum (strcat "key" (rtos (setq y (1+ y)) 2 0)))
(write-line (strcat " key = " (chr 34) keynum (chr 34) ";") fo)
(write-line (strcat "label = " (chr 34) (nth x dcllst) (chr 34) ";") fo)
(write-line (strcat " edit_width = " (rtos (nth (+ x 1) dcllst) 2 0) ";") fo)
(write-line (strcat " edit_limit = " (rtos (nth (+ x 2) dcllst) 2 0) ";") fo)
(write-line " is_enabled = true ;" fo)
(write-line " }" fo)
(setq x (+ x 4))
)
(write-line " }" fo)
(write-line "spacer_1 ;" fo)
(write-line "ok_only;}" fo)
(close fo)
(setq dcl_id (load_dialog fname))
(if (not (new_dialog "ddgetvalAH" dcl_id))
(exit)
)
(setq x -1)
(setq y 0)
(repeat num
(setq keynum (strcat "key" (rtos (setq y (1+ y)) 2 0)))
(setq valnum (strcat "val" (rtos y 2 0)))
(setq keylst (cons keynum keylst))
(setq vallst (cons valnum vallst))
)
(foreach a (reverse vallst)
(set (read a) (nth (setq x (+ x 4)) dcllst))
)
(setq x -1)
(foreach ab (mapcar '(lambda ( a b ) (list a b)) (reverse keylst) (reverse vallst))
(set_tile (car ab) (nth (setq x (+ x 4)) dcllst))
(action_tile (car ab) (strcat "(setq " (cadr ab) " $value)"))
(mode_tile (car ab) 3)
)
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete fname)
)HTH。,M、 R。 问题是(read valnum)。您将其设置在循环内,但当valnum=val4时,动作互动程序动作发生在循环外,因此每个动作互动程序都将设置val4。
动作块在循环内,问题实际上是(设置)函数。。。在我的示例中,我使用了(setq)并通过直接(strcat)-输入字符串值来避免(读取)。。。
对不起,在我发布之前没有看到你的帖子。是的,在BigAls代码中,设置动作平铺在循环内,但循环结束。此时,valnum=val4。然后,对话框启动,动作块事件在循环外发生(为每个动作块事件设置(读取值)$值);循环外的valnum=val4。因此,每个动作块事件都会设置val4。
顺便说一句,解决方法不错。 只有4种乐趣:
;
; for BigAl - rlx 4 sep 2018
(defun Eddie ( $txt1 %lst / err fn fp dcl nof-eddies Eddie-list slider-index org-list)
(Eddie_Init)
(Eddie_Dialog)
(Eddie_Exit)
(terpri)
%lst
)
(defun Eddie_Init ()
(setq err *error* *error* Eddie_err org-list %lst)
(cond
((not (setq fn (vl-filename-mktemp "Eddie.dcl"))))
((not (setq fp (open fn "w"))))
((null %lst))
(t (setq nof-eddies (length %lst)))
)
(if (null %lst)
(progn (alert "Nothing to show")(Eddie_Exit))
(progn
(Eddie_write_header)
(if (<= nof-eddies 10)(Eddie_write_body1 %lst)(Eddie_write_body2 %lst))
(Eddie_write_footer)
)
)
(if fp (close fp))(gc)
(setq slider-index 0)
)
(defun Eddie_err (s) (princ s)(Eddie_Exit)(princ))
(defun Eddie_Exit ()
(setq *error* err)
(if fp (close fp))
(if dcl (unload_dialog dcl))
(if (and fn (findfile fn))(vl-file-delete fn))
)
(defun Eddie_write_header ()
(write-line
(strcat
"Eddie:dialog{label=\"Eddie - BigAl (2018)\";spacer;spacer;"
":text_part {key=\"txt1\";width=32;fixed_width=true;}"
) fp))
(defun Eddie_write_body1 ( %lst / i )
(write-line ":boxed_row {" fp)
(write-line ":column {" fp)
(setq i 0)
(mapcar
'(lambda (x)
(write-line
(strcat ":text_part{key=\"tp" (itoa i) "\";label=\"" (car x) "\";width=32;fixed_width=true;}")
fp
)
(setq i (1+ i))
)
%lst
);|close column|;(write-line "spacer;}" fp)
(write-line ":column {" fp)
(setq i 0)
(mapcar
'(lambda (x)
(write-line
(strcat ":edit_box{key=\"eb" (itoa i) "\";width=12;fixed_width=true;}")
fp
)
(setq i (1+ i))
)
%lst
);|close column & row|;(write-line "spacer;}}" fp)
)
(defun Eddie_write_body2 ( %lst / i )
(write-line ":boxed_row {" fp)
(write-line ":column {" fp)
(setq i 0)
(repeat 10
(write-line
(strcat ":text_part {key=\"tp" (itoa i) "\";label=\"" (car (nth i %lst)) "\";width=32;fixed_width=true;}")
fp
)
(setq i (1+ i))
) ;|close column|; (write-line "spacer;}" fp)
(write-line ":column {" fp)
(setq i 0)
(repeat 10
(write-line
(strcat ":edit_box {key=\"eb" (itoa i) "\";width=12;fixed_width=true;}")
fp
)
(setq i (1+ i))
);|close column|; (write-line "spacer;}" fp)
(write-line
(strcat ":column {:slider {key=\"sldr\";layout=vertical;min_value="
(itoa (- 0 nof-eddies)) ";max_value=0;small_increment=1;big_increment=10;value=0;}}}"
)
fp
)
)
(defun Eddie_write_footer ()
(write-line "spacer;spacer;ok_cancel;}" fp))
(defun Eddie_Dialog ( / n drv inp)
(if (and (setq n 0 dcl (load_dialog fn)) (new_dialog "Eddie" dcl))
(progn
(Eddie_DialogUpdate)
(Eddie_DialogActions)
(setq drv (start_dialog))
(if (= drv 1)
(mapcar '(lambda (x y) (if (= x "1")(setq return (cons y return)))) Eddie-list %lst)
(setq return nil))
)
)
)
(defun Eddie_DialogUpdate ( / i )
(if (= (type $txt1) 'STR)(set_tile "txt1" $txt1))
(set_tile "sldr" (itoa slider-index))
(update_Eddies)
)
(defun Eddie_DialogActions ()
(repeat 10 (action_tile (strcat "eb" (itoa n)) (strcat "(edit_me $value " (itoa n) ")" ))(setq n (1+ n)))
(action_tile "sldr" "(update_slider $value)")
(action_tile "ok" "(done_dialog 1)")
(action_tile "cancel" "(setq %lst org-list)(done_dialog 0)")
)
(defun update_slider ( #i )
(setq slider-index (atoi #i))
(Eddie_DialogUpdate)
)
(defun update_Eddies (/ Eddie-index Eddie-name i)
;max number of Eddies in dialog is 10
(if (> (abs slider-index) (- nof-eddies 10))
(setq Eddie-index (- nof-eddies 10))(setq Eddie-index (abs slider-index)))
(if (< Eddie-index 0)(setq Eddie-index 0))
(setq i 0)
(while (and (< i 10) (setq Eddie-name (car (nth Eddie-index %lst))))
(set_tile (strcat "tp" (itoa i)) Eddie-name)
(set_tile (strcat "eb" (itoa i)) (vl-princ-to-string (cadr (nth Eddie-index %lst))))
(setq i (1+ i) Eddie-index (1+ Eddie-index))
)
)
(defun edit_me ( $v #i / idx )
(if (> (abs slider-index) (- nof-eddies 10))
(setq idx (- nof-eddies 10)) (setq idx (abs slider-index)))
(setq idx (+ #i (if (< idx 0) 0 idx))
%lst (subst (list (car (nth idx %lst)) $v) (nth idx %lst) %lst)))
;print list (test function)
(defun prl (lst)(mapcar '(lambda(x)(princ "\n")(princ x)) lst))
(defun c:t1 ()
(prl
(Eddie "This is heading" '(("Line 1" 1) ("Line 2" 22) ("Line 3" 33)("Line 4" 44)))
)
(princ)
)
(defun c:t2 ()
(prl
(Eddie "This is heading"
'( ("Line 1" 11) ("Line 2" 22) ("Line 3" 33) ("Line 4" 44) ("Line 5" 55)
("Line 6" 66) ("Line 7" 77) ("Line 8" 88) ("Line 9" 99) ("Line 10" 100)
("Line 11" 110) ("Line 12" 120) ("Line 13" 130) ("Line 14" 140) ("Line 15" 150)
)
)
)
(princ)
)
我的2美分:
改变
(action_tile keynum (strcat "(set " "(read valnum)" " $value)"))
(action_tile keynum (strcat "(setq val" (itoa y) " $value)"))
并删除
(setq valnum (strcat "val" (rtos y 2 0))) @德拉诺
你是对的,但我认为这不是唯一的问题。。。在循环并完成动作磁贴后,未更改的值似乎不会被签名到val变量。。。所以我必须按照我修改的方式来做。。。不确定,但只需在对话框中按“确定”即可检查是否需要,并且不要更改任何内容。。。如果val(s)不是nil(s),那么您的修复是可以的,但如果我是对的,那么我认为它必须被编码得更大。。。我仍然不太明白为什么(set)不能工作-必须(setq)-ing。。。 @马尔科·里巴
我在BigAl中添加了一些代码来处理被选择的OK,并将值收集到一个列表中以传递回调用程序。这将返回预期值。我的改编代码:
有趣的是(set(read numval)1)在命令行上工作,但尝试时出错(strcat“set”(read numval)“$value”)
通过将(read numval)更改为“(read numval)”解决了该错误。然而,这是一个字符串,因此在生成字符串“set(read numval)$value”的strcat中永远不会计算(read numval)。该字符串被设置为所有4个编辑框的操作命令,仅在触发action\u tile事件时才对其进行计算,该事件位于循环之外。希望这有意义。
(defun tst1 ( / $value val1)
; (action_tile "key1" (strcat "(setq " "val1" " $value)"))
; -> (action_tile "key1" "(setq val1 $value)")
(setq $value "1")
(eval "(setq val1 $value)")
(eval (read "(setq val1 $value)"))
(princ)
)
(defun tst2 ( / $value val1)
; (action_tile "key1" (strcat "(set " "val1" " $value)"))
; -> (action_tile "key1" "(set val1 $value)")
(setq $value "1")
(eval "(set val1 $value)")
; (eval (read "(set val1 $value)")) ; error: bad argument type: symbolp "1"
(eval (read "(set (quote val1) $value)"))
(princ)
)
页:
[1]
2