linhui12
发表于 2008-6-15 20:17:00
<p><font color="#ff0000">搞了一整天都是点"保存"或"取消"后再运行"GETDATA"才能返回前一次输入的"P""D""N""R"值,请问如何实现点击"选择"或"继续选择"后显示的对话框中显示前一次输入的"P""D""N""R"值呢,请大家指教.谢谢</font></p><p>DCL文件:</p><p>getdata : dialog {<br/> label="提取多义线顶点坐标";<br/> : boxed_column {<br/> label="列表";<br/> : list_box {key="list1";width=20;height=20;}<br/> : column {<br/> : row {<br/> : edit_box {label="P:";key="P";edit_width=3;}<br/> : edit_box {label="D:";key="D";edit_width=6;}<br/> : row {<br/> : edit_box {label="N:";key="N";edit_width=3;} <br/> } <br/> : edit_box {label="R:";key="R";edit_width=6;}<br/> }<br/> }<br/> }<br/> :row {<br/> :retirement_button {label="选择..";key="xz";}<br/> :retirement_button {label="继续选择..";key="jxxz";}<br/> :retirement_button {label="保存..";key="accept";is_default=true;}<br/> :button{label="取消";key="cancel";is_cancel=true;}<br/> }<br/>}</p><p>LISP文件:</p><p>(defun setdialog ()<br/> (set_tile "P" (if p (itoa p) "1"))<br/> (set_tile "D" (if D (rtos D 2) "508"))<br/> (set_tile "N" (if N1 (itoa N1) "4"))<br/> (set_tile "R" (if R1 (rtos R1 2) "500"))<br/> (mode_tile "jxxz" 1)<br/> (mode_tile "bcsj" 1)<br/>)<br/>(defun GETVALOFDIA ()<br/> (setq p (read (get_tile "P"))<br/> d (read (get_tile "D"))<br/> n1 (read (get_tile "N"))<br/> r1 (read (get_tile "R")))<br/>)<br/>(defun showbutton ()<br/> (mode_tile "jxxz" 0)<br/> (mode_tile "bcsj" 0)<br/>)<br/>(defun showlist (/ i lst)<br/> (setq i 0)<br/> (start_list "list1")<br/> (repeat (length lbl)<br/> (setq lst (nth i lbl))<br/> (add_list (car lst))<br/> (MAPCAR (quote ADD_LIST) (cadr lst))<br/> (setq i (1+ i))<br/> )<br/> (end_list)<br/>)<br/>(DEFUN C:getdata ( <br/>;/ P D SST H fi N1 I J K NAME DXF TYPE_LINE XY_COUNT F x y PT1 R1<br/>)<br/> (setq lbl (list) re 5)<br/> (IF (> (SETQ DCL_ID (LOAD_DIALOG "getdata")) 0) (progn<br/> (while (> re 1)<br/> (IF (NEW_DIALOG "getdata" DCL_ID "") (PROGN<br/> (if (= (length lbl) 0) (setdialog) (showlist))<br/> (action_tile "xz" "(showbutton)(getvalofdia)(done_dialog 2)")<br/> (action_tile "jxxz" "(getvalofdia)(done_dialog 3)")<br/> (action_tile "accept" "(GETVALOFDIA) (DONE_DIALOG 1)")<br/> (action_tile "cancel" "(DONE_DIALOG 0)")<br/> (SETQ RE (START_DIALOG))<br/> (if (or (= RE 2) (= RE 3)) (progn<br/> (if (= re 2) (setq lbl (list)))<br/> (PROMPT " \n选多义线:")<br/> (if (SETQ SST (SSGET '((0 . "*POLYLINE")))) (progn<br/> (SETQ J 0 te (list))<br/> (REPEAT (SSLENGTH SST)<br/> (setq ta (list (strcat (itoa p) "," (rtos D 2 3) "," (rtos R1 2 3) "," (itoa N1))))<br/> (SETQ NAME (SSNAME SST J))<br/> (SETQ J (1+ J))<br/> (SETQ DXF (ENTGET NAME))<br/> (SETQ TYPE_LINE (CDR (ASSOC 0 DXF)))<br/> (SETQ XY_COUNT (EVAL (READ (STRCAT "(" TYPE_LINE " DXF NAME)"))))<br/> (setq k 0 tl (list))<br/> (repeat (length xy_count)<br/> (setq y (nth k xy_count))<br/> (setq h (caddr y))<br/> (setq x (cadr y))<br/> (setq y (car y))<br/> (setq tl (cons (strcat (rtos y 2 3) "," (rtos x 2 3) "," (rtos h 2 3)) tl))<br/> (setq k (1+ k))<br/> )<br/> (setq te (append te (list (append ta (list (reverse tl))))))<br/> (setq p (1+ p))<br/> )<br/> (setq lbl (append lbl te))<br/> ))<br/> ))<br/> )<br/> (ALERT "Unable to display dialog box!\n无法显示对话框!")<br/> )<br/> )<br/> (UNLOAD_DIALOG DCL_ID)<br/> )<br/> (ALERT "Unable to open dialog box!\n无法装载对话框!")<br/> )<br/> (if (= RE 1) (progn<br/> (setq fn (if fn fn ""))<br/> (setq fn (if fn fn "") fn (getfiled "写出文件" fn "Txt" 1))<br/> (setq f (open fn "w"))<br/> (setq i 0)<br/> (repeat (length lbl)<br/> (setq lcl (nth i lbl) i (1+ i))<br/> (princ (car lcl) f)<br/> (princ "," f)<br/> (setq ldl (cadr lcl) j 0)<br/> (repeat (length ldl)<br/> (princ (if (= j 0) "" ",") f)<br/> (princ (nth j ldl) f)<br/> (setq j (1+ j))<br/> )<br/> (princ "\n" f)<br/> )<br/> (close f)<br/> ))<br/> (princ)<br/>)<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>(defun POLYLINE (DXF E1 / XY E2 count_xy pd)<br/> (setq count_xy nil)<br/> (SETQ DXF (MEMBER (ASSOC 330 DXF) DXF))<br/> (SETQ E2 (ENTNEXT E1))<br/> (SETQ DXF (ENTGET E2))<br/> (setq e1 (cdr (assoc 0 dxf)))<br/> (while (= e1 "VERTEX")<br/> (setq e1 (cdr (assoc 10 dxf)))<br/> (setq pd (cdr (assoc 70 dxf)))<br/> (if (/= pd 16) (setq count_xy (cons e1 count_xy)))<br/> (setq e1 e2)<br/> (SETQ E2 (ENTNEXT E1))<br/> (SETQ DXF (ENTGET E2))<br/> (setq e1 (cdr (assoc 0 dxf)))<br/> )<br/> (setq COUNT_XY (reverse count_xy))<br/>)<br/></p>
ZZXXQQ
发表于 2008-6-15 23:41:00
这样试试:
(defun setdialog ()
(set_tile "P" (if p (itoa p) "1"))
(set_tile "D" (if D (rtos D 2) "508"))
(set_tile "N" (if N1 (itoa N1) "4"))
(set_tile "R" (if R1 (rtos R1 2) "500"))
(mode_tile "jxxz" 1)
(mode_tile "bcsj" 1)
)
(defun GETVALOFDIA ()
(setq p (read (get_tile "P"))
d (read (get_tile "D"))
n1 (read (get_tile "N"))
r1 (read (get_tile "R")))
)
(defun showbutton ()
(mode_tile "jxxz" 0)
(mode_tile "bcsj" 0)
)
(defun showlist (/ i lst)
(setq i 0)
(start_list "list1")
(repeat (length lbl)
(setq lst (nth i lbl))
(add_list (car lst))
(MAPCAR (quote ADD_LIST) (cadr lst))
(setq i (1+ i))
)
(end_list)
(set_tile "P" (if p (itoa p) "1"))
(set_tile "D" (if D (rtos D 2) "508"))
(set_tile "N" (if N1 (itoa N1) "4"))
(set_tile "R" (if R1 (rtos R1 2) "500"))
)
(DEFUN C:getdata (
;/ P D SST H fi N1 I J K NAME DXF TYPE_LINE XY_COUNT F x y PT1 R1
)
(setq lbl (list) re 5)
(IF (> (SETQ DCL_ID (LOAD_DIALOG "getdata1")) 0) (progn
(while (> re 1)
(IF (NEW_DIALOG "getdata" DCL_ID "") (PROGN
(if (= (length lbl) 0) (setdialog) (showlist))
(action_tile "xz" "(showbutton)(getvalofdia)(done_dialog 2)")
(action_tile "jxxz" "(getvalofdia)(done_dialog 3)")
(action_tile "accept""(GETVALOFDIA) (DONE_DIALOG 1)")
(action_tile "cancel" "(DONE_DIALOG 0)")
(SETQ RE (START_DIALOG))
(if (or (= RE 2) (= RE 3)) (progn
(if (= re 2) (setq lbl (list)))
(PROMPT " \n选多义线:")
(if (SETQ SST (SSGET '((0 . "*POLYLINE")))) (progn
(SETQ J 0 te (list))
(REPEAT (SSLENGTH SST)
(setq ta (list (strcat (itoa p) "," (rtos D 2 3) "," (rtos R1 2 3) "," (itoa N1))))
(SETQ NAME (SSNAME SST J))
(SETQ J (1+ J))
(SETQ DXF (ENTGET NAME))
(SETQ TYPE_LINE (CDR (ASSOC 0 DXF)))
(SETQ XY_COUNT (EVAL (READ (STRCAT "(" TYPE_LINE " DXF NAME)"))))
(setq k 0 tl (list))
(repeat (length xy_count)
(setq y (nth k xy_count))
(setq h (caddr y))
(setq x (cadr y))
(setq y (car y))
(setq tl (cons (strcat (rtos y 2 3) "," (rtos x 2 3) "," (rtos h 2 3)) tl))
(setq k (1+ k))
)
(setq te (append te (list (append ta (list (reverse tl))))))
(setq p (1+ p))
)
(setq lbl (append lbl te))
))
))
)
(ALERT "Unable to display dialog box!\n无法显示对话框!")
)
)
(UNLOAD_DIALOG DCL_ID)
)
(ALERT "Unable to open dialog box!\n无法装载对话框!")
)
(if (= RE 1) (progn
(setq fn (if fn fn ""))
(setq fn (if fn fn "") fn (getfiled "写出文件" fn "Txt" 1))
(setq f (open fn "w"))
(setq i 0)
(repeat (length lbl)
(setq lcl (nth i lbl) i (1+ i))
(princ (car lcl) f)
(princ "," f)
(setq ldl (cadr lcl) j 0)
(repeat (length ldl)
(princ (if (= j 0) "" ",") f)
(princ (nth j ldl) f)
(setq j (1+ j))
)
(princ "\n" f)
)
(close f)
))
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun POLYLINE (DXF E1 / XY E2 count_xy pd)
(setq count_xy nil)
(SETQ DXF (MEMBER (ASSOC 330 DXF) DXF))
(SETQ E2 (ENTNEXT E1))
(SETQ DXF (ENTGET E2))
(setq e1 (cdr (assoc 0 dxf)))
(while (= e1 "VERTEX")
(setq e1 (cdr (assoc 10 dxf)))
(setq pd (cdr (assoc 70 dxf)))
(if (/= pd 16) (setq count_xy (cons e1 count_xy)))
(setq e1 e2)
(SETQ E2 (ENTNEXT E1))
(SETQ DXF (ENTGET E2))
(setq e1 (cdr (assoc 0 dxf)))
)
(setq COUNT_XY (reverse count_xy))
)
linhui12
发表于 2008-6-16 01:35:00
<font color="#ff0000"><p>感谢<strong><font face="Verdana" color="#da2549">ZZXXQQ</font></strong>斑竹,发现程序有点小问题:</p><p>初次选完多段线后二次再点"选择"是将新选数据替换前面数据(即将前面数据清空后再输入新选数据,"<font color="#ff0000">P"=1</font>)</p><p>目前"P" 是累计前面数据的.(只要求"继续选择"时将累计前面数据)</p><p>请您查查原因.</p></font>
ZZXXQQ
发表于 2008-6-16 20:21:00
当点[选择]时程序已经将表lbl清空了。不知道为什么是累计数据。
linhui12
发表于 2008-6-16 20:39:00
<strong><font face="Verdana" color="#da2549">ZZXXQQ</font></strong>可否帮忙调试一下该程序,查查"当点[选择]时程序已经将表lbl清空"时为何"P"值还会累加,这是什么原因引起的呢???
linhui12
发表于 2008-6-17 15:02:00
<p>嘎嘎.....</p><p>自己解决了.将表lbl清空时顺便对"P"赋值为1就OK了.</p>
sicky111
发表于 2013-4-28 03:07:06
把CAD关了再重启,输入框的数值还在吗?