Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
dohoangviet1606

Vấn đề về sử dụng lại dữ liệu đã chọn của hộp thoại khi gọi lệnh mới - DCL

Các bài được khuyến nghị

Chào mọi người!

Em có vấn đề cần thỉnh giáo như sau: Khi dùng lệnh có hộp thoại,khi dùng lại lệnh các dữ liệu bên trong hộp thoại nó bề như ban đầu mình viết, em muốn sử dụng lại dữ liệu đã nhập lần trước đó để dùng tiếp lệnh. mong mọi người cho ý kiến

 

em có ví dụ cho dễ hình dung:

LISP:

;;;;
    (defun myerr ( msg )
        (setq *error* olderr)
    (setq luubatdiem (getvar "osmode"))
    (setq but1 nil)
    (setq ddiag nil)  
        (princ "\nXong")
    )
;;;;
(defun saveVars ()
    (setq DB (distof (get_tile "dimball")))
    (setq SC (atoi (get_tile "textscale")))    
    (setq mychoice (get_tile "mychoice"))
)
;;;
(defun C:VIDU (/ but1 ddiag)
    (setq VIDU_ID (load_dialog "VIDU.DCL"))
    (if (not (new_dialog "VIDU" VIDU_ID))(exit))

    (action_tile "reset" "(setq but1 1)(saveVars)(done_dialog)")
    (action_tile "accept" "(setq ddiag 1)(saveVars)(done_dialog)")
    (action_tile "cancel" "(setq ddiag 0)(done_dialog)")
    (start_dialog)
    (setq old_err *error*
    *error* MyErr)
    
    (cond 
        ((= but1 1)(RESET))
        ((= ddiag 1)(MYTEST))
        ((= ddiag 0)(princ "\nKet thuc"))
    )
    (setq *error* old_err)
    (princ)
)

;;;;
(defun MYTEST ()
    (setq k 1)
    (setq luubatdiem (getvar "osmode"))
    (setvar "osmode" 0)
    (cond   ((= mychoice "c-do")(setq mausac 1))
        ((= mychoice "c-vang")(setq mausac 2))
        ((= mychoice "c-xanh")(setq mausac 3))
    )
    (while k
        (setq D1 (getpoint "\nDiem tam : "))
        (vl-cmdf ".CIRCLE" D1 (* (/ DB 2) SC))
        (command ".chprop" "L" "" "C" mausac "")
    )
    (setq luubatdiem (getvar "osmode"))
    (princ)
)
;;;;
(defun RESET()
    (princ "\nChua co gi!")
)

 

DCL:

VIDU : dialog {
      label="Ve duong tron co mau:";
    :boxed_row {
      :button{
      label="RESET";
      width=10;
      key="reset";
      }
    }
    : boxed_column {
     : radio_column {
      key = "mychoice";
      :radio_button {
       key = "c-do";
       label = "Mau do";
      }
      : radio_button {
       key = "c-vang";
       label = "Mau Vang";
      }
      : radio_button {
       key = "c-xanh";
       label = "Mau Xanh";
      }
     }
    }
    : boxed_column {
    label = "Thong so";
     : edit_box {
     key = "dimball";
     label = "Duong kinh:";
     edit_width = 15;
     value = "";    
     }
     : edit_box {
     key = "textscale";
     label = "Ty le:";
     edit_width = 15;
     value = "1";    
     }
    }
      : boxed_row {
        : boxed_column {
          : button {
        key = "accept";
        label = " Okay ";
        is_default = true;
          }
          : button {
        key = "cancel";
        label = " Cancel ";
        is_default = false;
        is_cancel = true;
          }
        }
      }
}
;; Lisp trên là vẽ đường tròn có màu được chọn và đường kính được nhập vào hộp thoại

Khi dùng lại lệnh thì các option đã chọn ko còn  (như ảnh)

nên em muốn sửa khi dùng lại lệnh nó giữ nguyên những cái đã chọn

nếu có thể thì khi chọn RESET thì các nục đã chọn khôi phục như lisp ban đầu

 

-- Em cám ơn

 

P/S: em gửi file bên dưới, vì không tải lên file DCL lên em để file DCL định dạng txt

vidu.JPG

VIDU.lsp

VIDU.txt

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1. Dùng tệp txt để lưu dữ liệu. Các hàm open, read_line, write_line, close.

2. Dùng registry. Hàm vl-registry... để tạo khoá, key .

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

2 cách của bác @cuongtk2 Sử dụng lại dữ liệu cũ từ bản vẽ khác, rất hay nhưng mất công lưu file. Nếu chỉ cần trong bản vẽ này thì mình hay dùng LDATA hoặc đơn giản là 1 biến toàn cục là xong. 

Ví dụ:

(if bientoancuc (set_tile "key" bientoancuc))  

(action_tile "key" "(setq bientoancuc $Value)")

Thế là được

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
11 phút trước, cuongtk2 đã nói:

Mình cũng không nghĩ đến trường hợp viết hộp thoại để phục vụ cho 1 bản vẽ.

Không phải lisp chỉ phục vụ cho một bản vẽ. ví dụ bản vẽ này đang vẽ các đường tròn màu vàng đường kính 5CM, bản vẽ khác vẽ đường tròn màu đỏ đường kính 3cm. Đang vẽ bản vẽ này chuyển qua bản vẽ khác thì nó chỉ lưu và lấy thông tin tại bản vẽ đó thôi.

Chứ làm gì viết lisp, dcl cho 1 bản vẽ.

Còn muốn thay đổi thì nhập lại thông số trong hộp thoại.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn tham khảo cái này, mình nhảy được từ Leemac.

Cụ Lee dùng hàm tạo file .dcl nên tạo và chỉnh sửa trực tiếp trong Vlisp rất dễ dàng, không cần đính kèm file .dcl mỗi khi up file lisp

image.png.373e1905bb1ed7f32bf1c71000732553.png

;Mo hop thoai DCL
(defun C:tl ( / DCH DCL DIALOG FILENAME PATH TITLE TMP)
  (if (setq tmp (getvar 'roamablerootprefix))
    (setq path (strcat (vl-string-right-trim "\\" (vl-string-translate "/" "\\" tmp)) "\\Support"))
    (setq path (vl-string-right-trim "\\" (vl-string-translate "/" "\\" (getvar 'tempprefix))))
    )
  (setq title "DCL Sample v1.00")
  (setq filename "DCL Sample.dcl")
  (setq dialog "DCL_SAMPLE")
  (setq dcl (strcat path "\\" filename))
  (cond
    ((not (LM:dcl_write dcl dialog title))
     (princ "\nDCL file could not be written.")
     )
    ((<= (setq dch (load_dialog dcl)) 0)
     (princ "\nDCL file could not be loaded.")
     )
    ((not (new_dialog dialog dch))
     (princ "\nProgram dialog could not be loaded.")
     )
    (t
     (progn
       (LM:dcl_settile)
       (action_tile "LM-DEFAULT" "(LM:dcl_default)")
       (action_tile "accept" "(LM:dcl_savevar)")
       (action_tile "cancel" "(done_dialog)")
       (start_dialog)
       (unload_dialog dch)
       )
     )
    )
  (princ)
  )

;Tu dong dien theo bien
(defun LM:dcl_settile ()
  (start_list "LM-POPUP1" 3)
  (mapcar 'add_list LM-POPUP1-LIST)
  (end_list)

  (start_list "LM-LISTBOX1" 3)
  (mapcar 'add_list LM-LISTBOX1-LIST)
  (end_list)
  
  (mapcar '(lambda (sym) (set_tile (vl-symbol-name sym) (eval sym))) (mapcar 'car LM-VAR-DEFAULT))
  )

;Khoi phuc cai dat mac dinh
(defun LM:dcl_default ()
  (mapcar '(lambda (lst) (set_tile (vl-symbol-name (car lst)) (cdr lst))) LM-VAR-DEFAULT)
  )

;Luu gia tri dien vao bien
(defun LM:dcl_savevar ()
  (mapcar '(lambda (sym) (set sym (get_tile (vl-symbol-name sym)))) (mapcar 'car LM-VAR-DEFAULT))
  (done_dialog)
  )

;Khoi tao bien
(defun LM:dcl_setvar ()
  (setq LM-VAR-DEFAULT
	 '(
	   (LM-EDBOX1 . "1")
	   (LM-EDBOX2 . "2")
	   (LM-TOGGLE1 . "1")
	   (LM-TOGGLE2 . "0")
	   (LM-TOGGLE3 . "0")
	   (LM-RADIO1 . "1")
	   (LM-RADIO2 . "0")
	   (LM-RADIO3 . "0")
	   (LM-POPUP1 . "0")
	   (LM-LISTBOX1 . "")
	   )
	)
  (setq LM-POPUP1-LIST
	 '(
	   "Choice 1"
	   "Choice 2"
	   "Choice 3"
	   "Choice 4"
	   "Choice 5"
	   )
	)
  (setq LM-LISTBOX1-LIST
	 '(
	   "Choice 1"
	   "Choice 2"
	   "Choice 3"
	   "Choice 4"
	   "Choice 5"
	   )
	)
  (mapcar '(lambda (lst) (if (not (eval (car lst))) (set (car lst) (cdr lst)))) LM-VAR-DEFAULT)
  (princ)
  )
(LM:dcl_setvar)

;Tao file DCL
(defun LM:dcl_write (dcl dialog title / des)
  (setq des (open dcl "w"))
  (write-line
    (strcat dialog ":"
	    "\ndialog"
	    "\n\t{"
	    (strcat "\n\tlabel = \"" title "\";")
	    ) des)
  (foreach x
	   '(
	     "	: column"
	     "		{"
	     "		: row"
	     "			{"
	     "			: column"
	     "				{"
	     "				fixed_width = true ;"
	     "				width = 30 ;"
	     "				: boxed_column"
	     "					{"
	     "					label = \"Edit box\";"
	     "					: edit_box { key = \"LM-EDBOX1\"; label = \"Edit box 1\"; edit_width = 8; }"
	     "					: edit_box { key = \"LM-EDBOX2\"; label = \"Edit box 2\"; edit_width = 8; }"
	     "					}"
	     "				: boxed_column"
	     "					{"
	     "					label = \"Toggle\";"
	     "					: toggle { key = \"LM-TOGGLE1\"; label = \"Toggle 1\"; }"
	     "					: toggle { key = \"LM-TOGGLE2\"; label = \"Toggle 2\"; }"
	     "					: toggle { key = \"LM-TOGGLE3\"; label = \"Toggle 3\"; }"
	     "					}"
	     "				: boxed_column"
	     "					{"
	     "					label = \"Radio button\";"
	     "					: radio_button { key = \"LM-RADIO1\"; label = \"Radio 1\"; }"
	     "					: radio_button { key = \"LM-RADIO2\"; label = \"Radio 2\"; }"
	     "					: radio_button { key = \"LM-RADIO3\"; label = \"Radio 3\"; }"
	     "					}"
	     "				}"
	     "			: column"
	     "				{"
	     "				fixed_width = true ;"
	     "				width = 35 ;"
	     "				: boxed_column"
	     "					{"
	     "					label = \"Popup list\";"
	     "					: popup_list { key = \"LM-POPUP1\"; label = \"Popup list 1\"; edit_width = 15; }"
	     "					}"
	     "				: boxed_column"
	     "					{"
	     "					label = \"List box\";"
	     "					: list_box { key = \"LM-LISTBOX1\"; label = \"List box 1\"; multiple_select = true; height = 10; width = 15; }"
	     "					}"
	     "				}"
	     "			}"
	     "		: boxed_column"
	     "			{"
	     "			label = \"Text\";"
	     "			: text { key = \"LM-TEXT1\"; value = \"Text 1\"; }"
	     "			: text { key = \"LM-TEXT2\"; value = \"Text 2\"; }"
	     "			: text { key = \"LM-TEXT3\"; value = \"Text 3\"; }"
	     "			}"
	     "		: row"
	     "			{"
	     "			: spacer { width = 5 ; }"
	     "			: button { key = \"LM-DEFAULT\"; label = \"Default\"; fixed_width = true; width = 12 ; }"
	     "			: button { key = \"accept\"; label = \"OK\"; is_default = true; fixed_width = true; width = 12 ; }"
	     "			: button { key = \"cancel\"; label = \"Cancel\"; is_default = false; is_cancel = true; fixed_width = true; width = 12 ; }"
	     "			: spacer { width = 5 ; }"
	     "			}"
	     "		}"
	     )
    (write-line x des)
    )
  (write-line "\t}" des)
  (setq des (close des))
  (while (not (findfile dcl)))
  dcl
  )

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×