为什么get_tile获取不到值,大神帮帮忙
本帖最后由 lifuq1979 于 2018-10-8 17:14 编辑(defun c:TT ()
(setvar "cmdecho" 0)
(command ".UNDO" "BE")
(setq pt(getpoint "文字注记位置:"))
(insdcl2)
(entmake (list '(0 . "TEXT")(cons 1 txt)(cons 8 "ZJ")(cons 10 pt)(cons 40 3)(cons 41 0.8 )(cons 62 7)))
(setvar "cmdecho" 1)
(command ".UNDO" "E")
(PRINC)
)
(defun insdcl2 (/ dclname dlg f x)
(defun show_list (key newlist)
(start_list key)(mapcar 'add_list newlist ) (end_list))
(defun insdcl03 (i)
(if (/= i bz001) (setq bz002 "0"))
(setq lst2 (cdr (nth (atoi i) lst)) str0 (nth (atoi bz002) lst2) bz001 i)
(show_list "e03" lst2)
(set_tile "e01"str0) (set_tile "e03" bz002)
)
(defun insdcl04 (j)
(setq str0 (nth (atoi j) lst2) bz002 j )
(set_tile "e01" str0 ))
(setq lst '()
lst (cons (list "居民地" "砼" "混" "砖" "建" "简" "土" "破") lst)
lst (cons (list "植被" "苗" "松" "杉" "杂" "桔" "柚" "李" ) lst )
lst (cons (list "路面性质" "水泥" "碎石" "土" ) lst )
lst (cons (list "其它注记" "空坪" "施工地") lst)
lst (reverse lst)
)
(setq lst1 (mapcar 'car lst ) lst2 (cdr (car lst)) dclname (vl-filename-mktemp "re-dcl-tmp.dcl") f (open dclname "w"))
(foreach x (list "RENAME:dialog {" " label = \"文字注记\" ;"
" :edit_box{key = \"e01\" ;}" " :row {"
" :list_box { key = \"e02\" ;width = 15 ; height = 10 ;}"
" :list_box { key = \"e03\" ;width = 15 ; height = 10 ;allow_accept=true;}}" " :row {"
" :button {is_default = true ; key = \"e04\" ; label = \"确认\" ; }"
" :button { is_cancel = true ; key = \"e05\" ; label = \"取消\" ; }" " }}" )
(write-line x f))
(close f)
(setq dcl_re (load_dialog dclname))
(new_dialog "RENAME" dcl_re)
(show_list "e02" lst1)
(if (null bz001) (setq bz001 "0"))
(if (null bz002) (setq bz002 "0"))
(set_tile "e02" bz001)
(insdcl03 bz001)
(action_tile "e02" "(insdcl03$value)")
(action_tile "e03" "(insdcl04$value)")
(action_tile "accept" "(setq txt (get_tile \"e01\"))(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq bb (start_dialog))
(unload_dialog dcl_re)
(vl-file-delete dclname)
(if (= bb 0)(exit))
)
大神帮看看问题出在哪,我调试(setq txt (get_tile \"e01\"))返回nil,什么原因?
程序对话框参照郎大师帖子http://bbs.mjtd.com/forum.php?mo ... 5%C8%EB%B7%FB%BA%C5
其实你完全没必要读取那个值,直接把TXT设为STR0不就可以了么。如果硬要的话,试试把get_tile写在前面。。
(defun insdcl03 (i)
(if (/= i bz001) (setq bz002 "0"))
(setq lst2 (cdr (nth (atoi i) lst)) str0 (nth (atoi bz002) lst2) bz001 i)
(show_list "e03" lst2)
(set_tile "e01"str0) (set_tile "e03" bz002)
(setq txt (get_tile "e01"))
)
(defun insdcl04 (j)
(setq str0 (nth (atoi j) lst2) bz002 j )
(set_tile "e01" str0 )
(setq txt (get_tile "e01"))
)
本帖最后由 lifuq1979 于 2018-10-9 18:27 编辑
evayleung 发表于 2018-10-8 22:57
其实你完全没必要读取那个值,直接把TXT设为STR0不就可以了么。如果硬要的话,试试把get_tile写在前面。。
...
我之前就是直接用str0的,但我想要有即可选择,又可输入的效果,就如下图在选择松再在后面输入9要有松9的结果,按你那样点确定后还是松而不是松9,大师帮出个招啊!
(defun c:TTt ()
(setvar "cmdecho" 0)
(command ".UNDO" "BE")
(setq pt(getpoint "文字注记位置:"))
(insdcl2)
(entmake (list '(0 . "TEXT")(cons 1 txt)(cons 10 pt)(cons 40 3)(cons 41 0.8 )(cons 62 7)))
;(entmake (list '(0 . "TEXT") (cons 1 txt) (cons 10 pt) (cons 40 5)))
(setvar "cmdecho" 1)
(command ".UNDO" "E")
(PRINC)
)
(defun insdcl2 (/ dclname dlg f x)
(defun show_list (key newlist)
(start_list key)(mapcar 'add_list newlist ) (end_list))
(defun insdcl03 (i)
(if (/= i bz001) (setq bz002 "0"))
(setq lst2 (cdr (nth (atoi i) lst)) str0 (nth (atoi bz002) lst2) bz001 i)
(show_list "e03" lst2)
(set_tile "e01"str0) (set_tile "e03" bz002)
)
(defun insdcl04 (j)
(setq str0 (nth (atoi j) lst2) bz002 j )
(set_tile "e01" str0 )
)
(setq lst '()
lst (cons (list "居民地" "砼" "混" "砖" "建" "简" "土" "破") lst)
lst (cons (list "植被" "苗" "松" "杉" "杂" "桔" "柚" "李" ) lst )
lst (cons (list "路面性质" "水泥" "碎石" "土" ) lst )
lst (cons (list "其它注记" "空坪" "施工地") lst)
lst (reverse lst)
)
(setq lst1 (mapcar 'car lst ) lst2 (cdr (car lst)) dclname (vl-filename-mktemp "re-dcl-tmp.dcl") f (open dclname "w"))
(foreach x (list "RENAME:dialog {" " label = \"文字注记\" ;"
" :edit_box{key = \"e01\" ;}"
" :row {"
" :list_box { key = \"e02\" ;width = 15 ; height = 10 ;}"
" :list_box { key = \"e03\" ;width = 15 ; height = 10 ;}}"
" :row {"
" :button {is_default = true ; key = \"e04\" ; label = \"确认\" ; }"
" :button { is_cancel = true ; key = \"e05\" ; label = \"取消\" ; }"
" }}"
)
(write-line x f))
(close f)
(setq dcl_re (load_dialog dclname))
(new_dialog "RENAME" dcl_re)
(show_list "e02" lst1)
(if (null bz001) (setq bz001 "0"))
(if (null bz002) (setq bz002 "0"))
(set_tile "e02" bz001)
(insdcl03 bz001)
(action_tile "e02" "(insdcl03$value)")
(action_tile "e03" "(insdcl04$value)")
(action_tile "e01" "(Setq txt $Value)")
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq bb (start_dialog))
(unload_dialog dcl_re)
(vl-file-delete dclname)
(if (= bb 0)(exit))
)
这样子呢? 加多一行这个
(action_tile "e01" "(Setq txt $Value)")
前面的那个ENTMAKE我改了下,因为我没那些图层。就改简单些,你用回原来的就行。(foreach x (list "RENAME:dialog {" " label = \"文字注记\" ;"
" :edit_box{key = \"e01\" ;}"
" :row {"
" :list_box { key = \"e02\" ;width = 15 ; height = 10 ;}"
" :list_box { key = \"e03\" ;width = 15 ; height = 10 ;}}"
" :row {"
" :button {is_default = true ; key = \"e04\" ; label = \"确认\" ; }"
" :button { is_cancel = true ; key = \"e05\" ; label = \"取消\" ; }"
" }}"
)
(write-line x f))
这个也改了一下。
evayleung 发表于 2018-10-9 22:34
加多一行这个
前面的那个ENTMAKE我改了下,因为我没那些图层。就改简单些,你用回原来的就行。
谢谢evayleung的回复,按照以上修改,输入是有效了,可是直接选取不点“e01”输入框又出错了,最后按你修改的再将txt改成str0问题解决,谢谢evayleung,谢谢所有为他人解惑的老师们 本帖最后由 evayleung 于 2018-10-10 20:50 编辑
lifuq1979 发表于 2018-10-10 17:42
谢谢evayleung的回复,按照以上修改,输入是有效了,可是直接选取不点“e01”输入框又出错了,最后按你修 ...
我也没注意这个问题,毕竟不是自己的LSP。:D lifuq1979 发表于 2018-10-10 17:42
谢谢evayleung的回复,按照以上修改,输入是有效了,可是直接选取不点“e01”输入框又出错了,最后按你修 ...
(defun c:TTt ()
(setvar "cmdecho" 0)
(command ".UNDO" "BE")
(setq pt(getpoint "文字注记位置:"))
(insdcl2)
(entmake (list '(0 . "TEXT")(cons 1 txt)(cons 8 "ZJ")(cons 10 pt)(cons 40 3)(cons 41 0.8 )(cons 62 7)))
(setvar "cmdecho" 1)
(command ".UNDO" "E")
(PRINC)
)
(defun insdcl2 (/ dclname dlg f x)
(defun show_list (key newlist)
(start_list key)(mapcar 'add_list newlist ) (end_list))
(defun insdcl03 (i)
(if (/= i bz001) (setq bz002 "0"))
(setq lst2 (cdr (nth (atoi i) lst)) str0 (nth (atoi bz002) lst2) bz001 i)
(show_list "e03" lst2)
(set_tile "e01"str0) (set_tile "e03" bz002)
)
(defun insdcl04 (j)
(setq str0 (nth (atoi j) lst2) bz002 j )
(set_tile "e01" str0 )
)
(setq lst '()
lst (cons (list "居民地" "砼" "混" "砖" "建" "简" "土" "破") lst)
lst (cons (list "植被" "苗" "松" "杉" "杂" "桔" "柚" "李" ) lst )
lst (cons (list "路面性质" "水泥" "碎石" "土" ) lst )
lst (cons (list "其它注记" "空坪" "施工地") lst)
lst (reverse lst)
)
(setq lst1 (mapcar 'car lst ) lst2 (cdr (car lst)) dclname (vl-filename-mktemp "re-dcl-tmp.dcl") f (open dclname "w"))
(foreach x (list "RENAME:dialog {" " label = \"文字注记\" ;"
" :edit_box{key = \"e01\" ;}"
" :row {"
" :list_box { key = \"e02\" ;width = 15 ; height = 10 ;}"
" :list_box { key = \"e03\" ;width = 15 ; height = 10 ;}}"
" :row {"
" :button {is_default = true ; key = \"e04\" ; label = \"确认\" ; }"
" :button { is_cancel = true ; key = \"e05\" ; label = \"取消\" ; }"
" }}"
)
(write-line x f))
(close f)
(setq dcl_re (load_dialog dclname))
(new_dialog "RENAME" dcl_re)
(show_list "e02" lst1)
(if (null bz001) (setq bz001 "0"))
(if (null bz002) (setq bz002 "0"))
(set_tile "e02" bz001)
(insdcl03 bz001)
(action_tile "e02" "(insdcl03$value)(Setq txt (get_tile \"e01\"))")
(action_tile "e03" "(insdcl04$value)(Setq txt (get_tile \"e01\"))")
(action_tile "e01" "(Setq txt $Value)")
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq bb (start_dialog))
(unload_dialog dcl_re)
(vl-file-delete dclname)
(if (= bb 0)(exit))
)
这次好像可以了。。。
页:
[1]