lifuq1979 发表于 2018-10-8 17:08:17

为什么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

evayleung 发表于 2018-10-8 22:57:16

其实你完全没必要读取那个值,直接把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:18:29

本帖最后由 lifuq1979 于 2018-10-9 18:27 编辑

evayleung 发表于 2018-10-8 22:57
其实你完全没必要读取那个值,直接把TXT设为STR0不就可以了么。如果硬要的话,试试把get_tile写在前面。。
...
我之前就是直接用str0的,但我想要有即可选择,又可输入的效果,就如下图在选择松再在后面输入9要有松9的结果,按你那样点确定后还是松而不是松9,大师帮出个招啊!


evayleung 发表于 2018-10-9 22:31:05

(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))
)
这样子呢?

evayleung 发表于 2018-10-9 22:34:04

加多一行这个
(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))
这个也改了一下。

lifuq1979 发表于 2018-10-10 17:42:48

evayleung 发表于 2018-10-9 22:34
加多一行这个

前面的那个ENTMAKE我改了下,因为我没那些图层。就改简单些,你用回原来的就行。

谢谢evayleung的回复,按照以上修改,输入是有效了,可是直接选取不点“e01”输入框又出错了,最后按你修改的再将txt改成str0问题解决,谢谢evayleung,谢谢所有为他人解惑的老师们

evayleung 发表于 2018-10-10 20:49:10

本帖最后由 evayleung 于 2018-10-10 20:50 编辑

lifuq1979 发表于 2018-10-10 17:42
谢谢evayleung的回复,按照以上修改,输入是有效了,可是直接选取不点“e01”输入框又出错了,最后按你修 ...
我也没注意这个问题,毕竟不是自己的LSP。:D

evayleung 发表于 2018-10-11 00:41:35

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]
查看完整版本: 为什么get_tile获取不到值,大神帮帮忙