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

tạo dialog

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

em có 2 đoạn code làm y xì từ trong sách hướng dẫn mà ko hiện dialog lên được. Mong các bác chỉ bảo cho em, em mới chỉ tập tành học LISP :lol:

//Ten file:ex18-6.dcl

//muc dich: su dung ham mode_tile de thay doi trang thai cua edit_box

ex6: dialog {

label = "Grid setup";

:boxed_row {

label = "Grid";

: radio_button { label = "Grid &On"; key = " radio_on"; }

: radio_button { label = "Grid &Off"; key = "radio_off"; }

}

: edit_box { label = "&X Spacing"; edit_width = 6; key = "edit_X"; }

: edit_box { label = "&Y Spacing"; edit_width = 6; key = "edit_Y"; }

ok_cancel_err;

}

//Ket thuc file

 

;file ex18-6.lsp

;muc dich hien thi hop thoai ex6 chua trong ex18-6.dcl

(defun c:ex6 (/ DCL_ID)

(setq DCL_ID (load_dialog "C:\testlisp\ex18-6.DCL"))

(if (not (new_dialog "ex6" DCL_ID)) (exit))

(action_tile "radio_off" "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)")

(action_tile "radio_on" "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0)")

(start_dialog)

(unload_dialog DCL_ID)

(princ)

)

 

khi em load ex18.lsp rồi thực hiện ex6 thì hiện ra lỗi thế này :

Command: ex6

; error: quit / exit abort

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
em có 2 đoạn code làm y xì từ trong sách hướng dẫn mà ko hiện dialog lên được. Mong các bác chỉ bảo cho em, em mới chỉ tập tành học LISP :lol:

//Ten file:ex18-6.dcl

//muc dich: su dung ham mode_tile de thay doi trang thai cua edit_box

ex6: dialog {

label = "Grid setup";

:boxed_row {

label = "Grid";

: radio_button { label = "Grid &On"; key = " radio_on"; }

: radio_button { label = "Grid &Off"; key = "radio_off"; }

}

: edit_box { label = "&X Spacing"; edit_width = 6; key = "edit_X"; }

: edit_box { label = "&Y Spacing"; edit_width = 6; key = "edit_Y"; }

ok_cancel_err;

}

//Ket thuc file

 

;file ex18-6.lsp

;muc dich hien thi hop thoai ex6 chua trong ex18-6.dcl

(defun c:ex6 (/ DCL_ID)

(setq DCL_ID (load_dialog "C:\testlisp\ex18-6.DCL"))

(if (not (new_dialog "ex6" DCL_ID)) (exit))

(action_tile "radio_off" "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)")

(action_tile "radio_on" "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0)")

(start_dialog)

(unload_dialog DCL_ID)

(princ)

)

 

khi em load ex18.lsp rồi thực hiện ex6 thì hiện ra lỗi thế này :

Command: ex6

; error: quit / exit abort

(setq DCL_ID (load_dialog "C:\\testlisp\\ex18-6.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
(setq DCL_ID (load_dialog "C:\\testlisp\\ex18-6.DCL"))

em làm được rồi nhưng sao em xem của các bác khác dùng hàm load_dialog cũng chỉ dùng 1 dấu \, của em lại phải 2 dấu \\ nhỉ . mong bác giải thích giùm em.

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
em làm được rồi nhưng sao em xem của các bác khác dùng hàm load_dialog cũng chỉ dùng 1 dấu \, của em lại phải 2 dấu \\ nhỉ . mong bác giải thích giùm em.

Một dấu thì fải là cái này "/" = "\\"

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
....

(action_tile "radio_off" "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)")

(action_tile "radio_on" "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0)")

....

Các bác cho Tue_NV hỏi : Dấu \ trong hàm mode_tile có nghĩa là gì vậy??

 

(action_tile "radio_off" "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)")

(action_tile "radio_on" "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0)")

 

Mình thực sự chưa hiểu tác dụng của dấu \ trong hàm mode_tile. Mình thấy khi bỏ dấu \ đi thì Lisp không chạy được nữa. Phải chăng dấu \ là 1 phần không thể thiếu trong hàm mode_tile. Tue_NV thực sự chưa hiểu chổ này lắm. Các bác trên diễn đàn giải thích hộ dùm Tue_NV 1 chút nhé.

 

Tue_NV xin cảm ơn.

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
Các bác cho Tue_NV hỏi : Dấu \ trong hàm mode_tile có nghĩa là gì vậy??

 

(action_tile "radio_off" "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)")

(action_tile "radio_on" "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0)")

 

Mình thực sự chưa hiểu tác dụng của dấu \ trong hàm mode_tile. Mình thấy khi bỏ dấu \ đi thì Lisp không chạy được nữa. Phải chăng dấu \ là 1 phần không thể thiếu trong hàm mode_tile. Tue_NV thực sự chưa hiểu chổ này lắm. Các bác trên diễn đàn giải thích hộ dùm Tue_NV 1 chút nhé.

 

Tue_NV xin cảm ơn.

Hehe bác ơi. Trong String thì dấu \" <=> " trong string. Nó giống như \n hay \t mà bác rất hay dùng. Ví dụ muốn viết một string:

Anh"NV_Tue" ơi

Thì ta phải viết: Anh \"NV_Tue\" ơi

  • Vote tăng 1

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
Hehe bác ơi. Trong String thì dấu \" " trong string. Nó giống như \n hay \t mà bác rất hay dùng. Ví dụ muốn viết một string:

Anh"NV_Tue" ơi

Thì ta phải viết: Anh \"NV_Tue\" ơi

Cảm ơn bạn Nataca. Như vậy thì dấu \ trong hàm mode_tile là bắt buộc phải không? Mình đã thử bỏ dấu \ trong đoạn :

 

(action_tile "radio_off" "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)")

(action_tile "radio_on" "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0)")

 

Thì Lisp không chạy được nữa.

 

Tue_NV đã thử viết lại Code của bạn hungfrank (ON/OFF chế độ Grid). Nhưng khi mình tick vào Grid ON hoặc GRID OFF trong hộp thoại Grid setup thì lệnh được thực thi luôn đồng thời hộp thoại Grid setup đóng lại luôn.

 

Mình muốn tick vào Grid ON hoặc GRID OFF trong hộp thoại Grid setup và nhấn OK thì lệnh mới được thực thi nhưng chưa biết làm cách nào? Mong bạn Nataca và các bác trên diễn đàn chỉ giúp.

 

Đây là file DCL :

http://www.cadviet.com/upfiles/2/ex186.rar

Còn đây là code mà Tue_NV viết thử nhưng không đúng ý vì lí do mà mình đã trình bày ở trên :

(defun c:ex6 (/ DCL_ID)
(setq DCL_ID (load_dialog "ex18-6.DCL"))
(if (not (new_dialog "ex6" DCL_ID)) (exit))
(action_tile "radio_off" 
"(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1) (done_dialog 3)" )

(action_tile "radio_on" 
"(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) (done_dialog 2)" )	

(action_tile "accept" "(done_dialog 1)"  )
(action_tile "cancel" "(done_dialog 0)"  )
  (setq phepchon (start_dialog))
(cond
	((= phepchon 3) (gridoff))
	((= phepchon 2) (gridon))
)

(start_dialog)
(unload_dialog DCL_ID)
(princ)
)
;
(defun gridon()
(setvar "gridmode" 1) 
)
(defun gridoff()
(setvar "gridmode" 0)
)

Tue_NV đã tham khảo 2 bài viết của bác ssg và anh Duy78_2006 trong quá trình viết code.

http://www.cadviet.com/forum/index.php?sho...amp;#entry71018

Rất mong sự giúp đỡ của mọi người.

 

Tue_NV xin cảm ơn.

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
Tue_NV đã thử viết lại Code của bạn hungfrank (ON/OFF chế độ Grid). Nhưng khi mình tick vào Grid ON hoặc GRID OFF trong hộp thoại Grid setup thì lệnh được thực thi luôn đồng thời hộp thoại Grid setup đóng lại luôn.

 

Mình muốn tick vào Grid ON hoặc GRID OFF trong hộp thoại Grid setup và nhấn OK thì lệnh mới được thực thi nhưng chưa biết làm cách nào? Mong bạn Nataca và các bác trên diễn đàn chỉ giúp.

em sửa đoạn code của anh lại thế này:

(defun C:EX6 (/ DCL_ID PHEPCHON)
(setq CUR_GRID (getvar "gridmode"))
 (setq DCL_ID (load_dialog "ex18-6.DCL"))

 (setq PHEPCHON 5)
 (while (< 2 PHEPCHON)

(if	(not (new_dialog "ex6" DCL_ID))
  (exit)
);_ end  if
(if	OFF
  (progn (set_tile "radio_off" "1")
	 (set_tile "radio_on" "0")
	 (mode_tile "edit_X" 1)
	 (mode_tile "edit_Y" 1)
  );_ end  progn
  (progn (set_tile "radio_off" "0")
	 (set_tile "radio_on" "1")
	 (mode_tile "edit_X" 0)
	 (mode_tile "edit_Y" 0)
  );_ end  progn
);_ end  if
(action_tile
  "radio_off"
  "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)"
);_ end  action_tile
(action_tile
  "radio_off"
  "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)(setq off t)(done_dialog 3)"
);_ end  action_tile
(action_tile
  "radio_on"
  "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) (setq off nil)(done_dialog 4)"
);_ end  action_tile
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq PHEPCHON (start_dialog))
(cond
  ((= PHEPCHON 0) (setvar "gridmode" CUR_GRID))
  ((= PHEPCHON 3) (GRIDOFF))
  ((= PHEPCHON 4) (GRIDON))
);_ end  cond
 );_ end  while
 (start_dialog)
 (unload_dialog DCL_ID)
 (princ)
);_ end  defun
		;
(defun GRIDON ()
 (setvar "gridmode" 1)
);_ end  defun
(defun GRIDOFF ()
 (setvar "gridmode" 0)
);_ end  defun

anh xem thử nhé

 

nếu có sách autolisp của TS.Nguyễn Hữu Lộc - KS. Nguyễn Thành Trung thì anh tham khảo thêm "Chương trình vẽ biên dạng răng Spurhear.lsp" trang 310

  • Vote tăng 1

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
.................................

Tue_NV đã thử viết lại Code của bạn hungfrank (ON/OFF chế độ Grid). Nhưng khi mình tick vào Grid ON hoặc GRID OFF trong hộp thoại Grid setup thì lệnh được thực thi luôn đồng thời hộp thoại Grid setup đóng lại luôn.

 

Mình muốn tick vào Grid ON hoặc GRID OFF trong hộp thoại Grid setup và nhấn OK thì lệnh mới được thực thi nhưng chưa biết làm cách nào?

.....................................

Bạn tham khảo đoạn Lisp sau :

(defun c:ex6 (/ dcl_id phepchon grid)
 (setq DCL_ID (load_dialog "ex18-6.DCL"))
 (if (not (new_dialog "ex6" DCL_ID))
   (alert "\nKhong tim duoc file ex18-6.DCL.") )

 (setq grid (getvar "gridmode" )); get bien he thong gridmode
 (cond ;set nut Grid radio
   ((= grid 0) (set_tile "radio_off" "1")) 
   ((= grid 1) (set_tile "radio_on" "1"))    
   )
 (action_tile "radio_off" "(setq grid 0)")
 (action_tile "radio_on"  "(setq grid 1)")

 (action_tile "accept" "(done_dialog 1)")
 (action_tile "cancel" "(done_dialog 0)")

 (setq phepchon (start_dialog))
 (unload_dialog DCL_ID)
 (if (= phepchon 1)
   (cond
     ((= grid 0) (gridoff))
     ((= grid 1) (gridon))
     )
   )
 (princ)
)

(defun gridon () (setvar "gridmode" 1))

(defun gridoff() (setvar "gridmode" 0))

  • Vote tăng 1

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

Cảm ơn anh gia_bach và bạn master_worse nhiều lắm. :cheers:

Đọc qua Code thì Tue_NV đã thông được 1 số chổ. Nhưng còn 1 chổ chưa thông. Mong anh gia_bach và bạn master_worsevà mọi người trên diễn đàn chỉ giúp

 

Dựa trên code của bạn master_worse thì Tue_NV đã viết thêm code lấy được giá trị hiện thời của biến Gridunit và cho vào hộp box Edit_X Edit_Y. Và mình cũng đã viết code để lấy giá trị của của hộp Edit_X Edit_Y do User nhập vào và gán lại cho biến Gridunit để biến Gridunit nhận giá trị mới do User nhập vào nhưng chưa thành công. Tue_NV không biết code mà mình đã viết bị lỗi ở chổ nào mà biến Gridunit không chịu nhận giá trị mới do User nhập vào

 

(defun C:EX6 (/ DCL_ID PHEPCHON)
(setq CUR_GRID (getvar "gridmode"))
 (setq DCL_ID (load_dialog "ex18-6.DCL"))
(if (not edx) (setq edx (rtos (car (getvar "Gridunit")))))
	(if (not edy) (setq edy (rtos (cadr (getvar "Gridunit")))))

 (setq PHEPCHON 5)
 (while (
(if	(not (new_dialog "ex6" DCL_ID))
  (exit)
);_ end  if

(if	OFF
  (progn (set_tile "radio_off" "1")
	 (set_tile "radio_on" "0")
	 (mode_tile "edit_X" 1)
	 (mode_tile "edit_Y" 1)
  );_ end  progn
  (progn (set_tile "radio_off" "0")
	 (set_tile "radio_on" "1")
	 (mode_tile "edit_X" 0)
	 (mode_tile "edit_Y" 0)
	 (set_tile "edit_X" edx)
	 (set_tile "edit_Y" edy)
  );_ end  progn
);_ end  if

(action_tile
  "radio_off"
  "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1)(setq off t)(done_dialog 3)"
);_ end  action_tile

(action_tile
  "radio_on"
  "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) 
	(setq edX (get_tile \"edit_X\"))
	(setq edY (get_tile \"edit_Y\"))
	(setq off nil)(done_dialog 4)"
);_ end  action_tile

(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")

(setq PHEPCHON (start_dialog))
(cond
  ((= PHEPCHON 0) (setvar "gridmode" CUR_GRID))
  ((= PHEPCHON 3) (GRIDOFF))
  ((= PHEPCHON 4) (GRIDON))
);_ end  cond
);_ end  while
 (start_dialog)
 (unload_dialog DCL_ID)
 (princ)
);_ end  defun
;			;
(defun GRIDON ()
 (setvar "gridmode" 1)
(setvar "gridunit" (list (atof edX) (atof edY)))
);_ end  defun
(defun GRIDOFF ()
 (setvar "gridmode" 0)
);_ end  defun

Mong mọi người chỉ giúp.

Tue_NV xin chân thành cảm ơn.

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
...................................

Dựa trên code của bạn master_worse thì Tue_NV đã viết thêm code lấy được giá trị hiện thời của biến Gridunit và cho vào hộp box Edit_X Edit_Y. Và mình cũng đã viết code để lấy giá trị của của hộp Edit_X Edit_Y do User nhập vào và gán lại cho biến Gridunit để biến Gridunit nhận giá trị mới do User nhập vào nhưng chưa thành công. Tue_NV không biết code mà mình đã viết bị lỗi ở chổ nào mà biến Gridunit không chịu nhận giá trị mới do User nhập vào

...................................

Bạn cần phải viết hàm đáp ứng với sự kiện "nguời dùng cập nhật giá trị" <==> action_tile vào hộp box Edit_X Edit_Y:

(action_tile "edit_X" "(setq edx $value)"); lay gia tri X

(action_tile "edit_Y" "(setq edy $value)"); lay gia tri Y

 

Bạn tham khảo đoạn Lisp sau :

(defun c:ex6 (/ dcl_id phepchon grid grid_X grid_Y)
 (setq DCL_ID (load_dialog "ex18-6.DCL"))
 (if (not (new_dialog "ex6" DCL_ID))
   (alert "\nKhong tim duoc file ex18-6.DCL.") )

 ; khoi dong
 (setq grid (getvar "gridmode" )); lay bien he thong gridmode
 (setq grid_X (rtos(car  (getvar "Gridunit"))))
 (setq grid_Y (rtos(cadr (getvar "Gridunit"))))

 (cond ;gan nut Grid va k/cach Grid
   ((= grid 0)
    (set_tile "radio_off" "1")
    (mode_tile "edit_X" 1)
    (mode_tile "edit_Y" 1) ) 
   ((= grid 1)
    (set_tile "radio_on" "1")
    (mode_tile "edit_X" 0)
    (mode_tile "edit_Y" 0)
    (set_tile "edit_X" grid_X)
    (set_tile "edit_Y" grid_Y))
   )
 ;main
 (action_tile "radio_off" "(Tat_Grid)")
 (action_tile "radio_on"  "(Bat_Grid)")

 (action_tile "edit_X" "(setq grid_X $value)"); lay gia tri
 (action_tile "edit_Y" "(setq grid_Y $value)")

 (action_tile "accept" "(done_dialog 1)")
 (action_tile "cancel" "(done_dialog 0)")

 (setq phepchon (start_dialog))
 (unload_dialog DCL_ID)  
 (if (= phepchon 1)
   (cond
     ((= grid 0) (gridoff))
     ((= grid 1) (gridon))
     )
   )
 (princ)
)

(defun gridon ()
 (setvar "gridmode" 1)
 (setvar "Gridunit" (list (atof grid_X)(atof grid_Y))) )

(defun gridoff() (setvar "gridmode" 0))

(defun Tat_Grid()
 (setq grid 0)
 (mode_tile "edit_X" 1)
 (mode_tile "edit_Y" 1)
 )

(defun Bat_Grid()
 (setq grid 1)
 (mode_tile "edit_X" 0)
 (mode_tile "edit_Y" 0)
 (set_tile "edit_X" grid_X)
 (set_tile "edit_Y" grid_Y)
 )

  • Vote tăng 1

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
Cảm ơn anh gia_bach và bạn master_worse nhiều lắm. :cheers:

Đọc qua Code thì Tue_NV đã thông được 1 số chổ. Nhưng còn 1 chổ chưa thông. Mong anh gia_bach và bạn master_worsevà mọi người trên diễn đàn chỉ giúp

 

Dựa trên code của bạn master_worse thì Tue_NV đã viết thêm code lấy được giá trị hiện thời của biến Gridunit và cho vào hộp box Edit_X Edit_Y. Và mình cũng đã viết code để lấy giá trị của của hộp Edit_X Edit_Y do User nhập vào và gán lại cho biến Gridunit để biến Gridunit nhận giá trị mới do User nhập vào nhưng chưa thành công. Tue_NV không biết code mà mình đã viết bị lỗi ở chổ nào mà biến Gridunit không chịu nhận giá trị mới do User nhập vào

 

Mong mọi người chỉ giúp.

Tue_NV xin chân thành cảm ơn.

Chào bác Tue_NV,

Có rất nhiều dạng hộp thoại dialog khác nhau bác à,

Bác thử tham khảo phần lý thuyết này của cụ JeffySander nhé.

http://www.cadviet.com/upfiles/2/the_dcl_a...sp_tutorial.doc

Đây là cái mình tự dịch để học. Nếu có chỗ nào chưa đúng thì bác châm chước cho nhé và nếu có thể bác giúp mình sửa lại và chỉ cho mình biết với.

Cám ơn bác trước.

  • Vote tăng 1

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
............................................

 

Dựa trên code của bạn master_worse thì Tue_NV đã viết thêm code lấy được giá trị hiện thời của biến Gridunit và cho vào hộp box Edit_X Edit_Y. Và mình cũng đã viết code để lấy giá trị của của hộp Edit_X Edit_Y do User nhập vào và gán lại cho biến Gridunit để biến Gridunit nhận giá trị mới do User nhập vào nhưng chưa thành công. Tue_NV không biết code mà mình đã viết bị lỗi ở chổ nào mà biến Gridunit không chịu nhận giá trị mới do User nhập vào

 

Mong mọi người chỉ giúp.

Tue_NV xin chân thành cảm ơn.

Em sửa lại đoạn code của anh rồi, anh xem thừ:

(defun C:EX6 (/ DCL_ID PHEPCHON CUR_GRID)

 (setq CUR_GRID (mapcar 'getvar '("gridmode" "Gridunit")))

 (setq DCL_ID (load_dialog "ex18-6.DCL"))
 (setq PHEPCHON 5)
 (while (< 2 PHEPCHON)
(if (not (new_dialog "ex6" DCL_ID))
  (exit)
);_ end  if

(setq EDX (rtos (car (getvar "Gridunit"))))
(setq EDY (rtos (cadr (getvar "Gridunit"))))

(if OFF
  (progn (set_tile "radio_off" "1")
		 (set_tile "radio_on" "0")
		 (mode_tile "edit_X" 1)
		 (mode_tile "edit_Y" 1)

		 (set_tile "edit_X" EDX)
		 (set_tile "edit_Y" EDY)

		 (setvar "gridmode" 0)

  );_ end  progn
  (progn (set_tile "radio_off" "0")
		 (set_tile "radio_on" "1")
		 (mode_tile "edit_X" 0)
		 (mode_tile "edit_Y" 0)
		 (set_tile "edit_X" EDX)
		 (set_tile "edit_Y" EDY)

		 (setvar "gridmode" 1)
  );_ end  progn
);_ end  if
(action_tile
  "radio_off"
  "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1) (setq off t)(done_dialog 3)"
);_ end  action_tile
(action_tile
  "radio_on"
  "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) (setq off nil)(done_dialog 4)"
);_ end  action_tile
(action_tile "edit_X" "(setq EDX $value)"); lay gia tri
(action_tile "edit_Y" "(setq EDY $value)")
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq PHEPCHON (start_dialog))
(cond ((= PHEPCHON 0) (mapcar 'setvar '("gridmode" "Gridunit") CUR_GRID))
	  ((= PHEPCHON 3) (GRIDOFF))
	  ((= PHEPCHON 4) (GRIDON))
);_ end  cond
 );_ end  while
 (start_dialog)
 (unload_dialog DCL_ID)
 (princ)
);_ end  defun
					;		;
(defun GRIDON () (setvar "gridmode" 1) (setvar "gridunit" (list (atof EDX) (atof EDY))))
(defun GRIDOFF () (setvar "gridmode" 0) (setvar "gridunit" (list (atof EDX) (atof EDY))))

 

hoặc anh sử dụng đoạn code này, em sửa lại của lão tiền bối gia_bach, tiền bối xem góp ý cho em luôn nha!

(defun C:EX6 (/ DCL_ID PHEPCHON GRID GRID_X GRID_Y)

 (setq CUR_GRID (mapcar 'getvar '("gridmode" "Gridunit")));_[b]em thêm chổ này[/b]

 (setq DCL_ID (load_dialog "ex18-6.DCL"))
 (if (not (new_dialog "ex6" DCL_ID))
(alert "\nKhong tim duoc file ex18-6.DCL.")
 )					 ; khoi dong
 (setq GRID (getvar "gridmode")); lay bien he thong gridmode  
 (setq GRID_X (rtos (car (getvar "Gridunit"))))
 (setq GRID_Y (rtos (cadr (getvar "Gridunit"))))
 (cond				 ;gan nut Grid va k/cach Grid
((= GRID 0) (set_tile "radio_off" "1") (mode_tile "edit_X" 1) (mode_tile "edit_Y" 1))
((= GRID 1)
 (set_tile "radio_on" "1")
 (mode_tile "edit_X" 0)
 (mode_tile "edit_Y" 0)
 (set_tile "edit_X" GRID_X)
 (set_tile "edit_Y" GRID_Y)
)
 )					 ;main
 (action_tile "radio_off" "(Tat_Grid)")
 (action_tile "radio_on" "(Bat_Grid)")
 (action_tile "edit_X" "(setq grid_X $value)"); lay gia tri
 (action_tile "edit_Y" "(setq grid_Y $value)")
 (action_tile "accept" "(done_dialog 1)")
 (action_tile "cancel" "(done_dialog 0)")
 (setq PHEPCHON (start_dialog))
 (unload_dialog DCL_ID)
 (if (= PHEPCHON 1)
(cond ((= GRID 0) (GRIDOFF))
	  ((= GRID 1) (GRIDON))
);_ end  cond
(mapcar 'setvar '("gridmode" "Gridunit") CUR_GRID);;_[b]em thêm chổ này[/b]
 );_ end  if
 (princ)
);_ end  defun

(defun GRIDON () (setvar "gridmode" 1) (setvar "Gridunit" (list (atof GRID_X) (atof GRID_Y))))

(defun GRIDOFF () (setvar "gridmode" 0))

(defun TAT_GRID ()
 (setq GRID 0)  
 (mode_tile "edit_X" 1)
 (mode_tile "edit_Y" 1)

 (setvar "gridmode" 0);_[b]em thêm chổ này[/b]

);_ end  defun

(defun BAT_GRID ()
 (setq GRID 1)
 (mode_tile "edit_X" 0)
 (mode_tile "edit_Y" 0)
 (set_tile "edit_X" GRID_X)
 (set_tile "edit_Y" GRID_Y)

 (setvar "gridmode" 1);_[b]em thêm chổ này[/b]

);_ end  defun

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
Em sửa lại đoạn code của anh rồi, anh xem thừ:

(defun C:EX6 (/ DCL_ID PHEPCHON CUR_GRID)

 (setq CUR_GRID (mapcar 'getvar '("gridmode" "Gridunit")))

 (setq DCL_ID (load_dialog "ex18-6.DCL"))
 (setq PHEPCHON 5)
 (while (	(if (not (new_dialog "ex6" DCL_ID))
  (exit)
);_ end  if

(setq EDX (rtos (car (getvar "Gridunit"))))
(setq EDY (rtos (cadr (getvar "Gridunit"))))

(if OFF
  (progn (set_tile "radio_off" "1")
		 (set_tile "radio_on" "0")
		 (mode_tile "edit_X" 1)
		 (mode_tile "edit_Y" 1)

		 (set_tile "edit_X" EDX)
		 (set_tile "edit_Y" EDY)

		 (setvar "gridmode" 0)

  );_ end  progn
  (progn (set_tile "radio_off" "0")
		 (set_tile "radio_on" "1")
		 (mode_tile "edit_X" 0)
		 (mode_tile "edit_Y" 0)
		 (set_tile "edit_X" EDX)
		 (set_tile "edit_Y" EDY)

		 (setvar "gridmode" 1)
  );_ end  progn
);_ end  if
(action_tile
  "radio_off"
  "(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1) (setq off t)(done_dialog 3)"
);_ end  action_tile
(action_tile
  "radio_on"
  "(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) (setq off nil)(done_dialog 4)"
);_ end  action_tile
(action_tile "edit_X" "(setq EDX $value)"); lay gia tri
(action_tile "edit_Y" "(setq EDY $value)")
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq PHEPCHON (start_dialog))
(cond ((= PHEPCHON 0) (mapcar 'setvar '("gridmode" "Gridunit") CUR_GRID))
	  ((= PHEPCHON 3) (GRIDOFF))
	  ((= PHEPCHON 4) (GRIDON))
);_ end  cond
 );_ end  while
 (start_dialog)
 (unload_dialog DCL_ID)
 (princ)
);_ end  defun
					;		;
(defun GRIDON () (setvar "gridmode" 1) (setvar "gridunit" (list (atof EDX) (atof EDY))))
(defun GRIDOFF () (setvar "gridmode" 0) (setvar "gridunit" (list (atof EDX) (atof EDY))))

Rất cảm ơn anh gia_bach và bạn master_worse đã nhiệt tình giúp đỡ.

Bạn master_worse có thể xem lại code trên của bạn 1 chút được không? Khi chạy Lisp thì biến Gridunit không chịu nhận giá trị mới do User nhập vào. Bạn xem lại dùm Tue_NV 1 chút nhé.

 

Tiện thể bạn cho mình hỏi về chổ này :

 

(action_tile

"radio_off"

"(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1) (setq off t)(done_dialog 3)"

);_ end action_tile

(action_tile

"radio_on"

"(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) (setq off nil)(done_dialog 4)"

);_ end action_tile

 

Bạn Nataca có giải thích về dấu \ trong hàm mode_tile nhưng thực sự là mình chưa hiểu lắm về nó. Hay là cú pháp của nó phải vậy và ta phải ghi như thế. Mình chưa sử dụng dấu \ này trong code bao giờ nên lọ mọ còn chổ chưa thông? Mong bạn master_worse, anh gia bach và các bác trên diễn đàn có thể chi tiết cho chổ này với.

Cảm ơn rất nhiều

 

Thanks

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
Cảm ơn anh gia_bach và bạn master_worse nhiều lắm. :cheers:

Đọc qua Code thì Tue_NV đã thông được 1 số chổ. Nhưng còn 1 chổ chưa thông. Mong anh gia_bach và bạn master_worsevà mọi người trên diễn đàn chỉ giúp

 

Dựa trên code của bạn master_worse thì Tue_NV đã viết thêm code lấy được giá trị hiện thời của biến Gridunit và cho vào hộp box Edit_X Edit_Y. Và mình cũng đã viết code để lấy giá trị của của hộp Edit_X Edit_Y do User nhập vào và gán lại cho biến Gridunit để biến Gridunit nhận giá trị mới do User nhập vào nhưng chưa thành công. Tue_NV không biết code mà mình đã viết bị lỗi ở chổ nào mà biến Gridunit không chịu nhận giá trị mới do User nhập vào

 

Mong mọi người chỉ giúp.

Tue_NV xin chân thành cảm ơn.

Chào bác Tue_NV,

Có rất nhiều dạng hộp thoại dialog khác nhau bác à,

Bác thử tham khảo phần lý thuyết này của cụ JeffySander nhé.

http://www.cadviet.com/upfiles/2/the_dcl_a...sp_tutorial.doc

Đây là cái mình tự dịch để học. Nếu có chỗ nào chưa đúng thì bác châm chước cho nhé và nếu có thể bác giúp mình sửa lại và chỉ cho mình biết với.

Cám ơn bác trướ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
..............

Bạn master_worse có thể xem lại code trên của bạn 1 chút được không? Khi chạy Lisp thì biến Gridunit không chịu nhận giá trị mới do User nhập vào. Bạn xem lại dùm Tue_NV 1 chút nhé.

Anh sửa lại chổ này (action_tile "accept" "(done_dialog 1)") thành

(action_tile "accept"

"(setq EDX (get_tile \"edit_X\")

EDY (get_tile \"edit_Y\"))

(setvar \"gridunit\" (list (atof EDX) (atof EDY)))

(done_dialog 1)")

 

................................................................................

 

.......

Tiện thể bạn cho mình hỏi về chổ này :

 

(action_tile

"radio_off"

"(mode_tile \"edit_X\" 1) (mode_tile \"edit_Y\" 1) (setq off t)(done_dialog 3)"

);_ end action_tile

(action_tile

"radio_on"

"(mode_tile \"edit_X\" 0) (mode_tile \"edit_Y\" 0) (setq off nil)(done_dialog 4)"

);_ end action_tile

 

Bạn Nataca có giải thích về dấu \ trong hàm mode_tile nhưng thực sự là mình chưa hiểu lắm về nó. Hay là cú pháp của nó phải vậy và ta phải ghi như thế. Mình chưa sử dụng dấu \ này trong code bao giờ nên lọ mọ còn chổ chưa thông? Mong bạn master_worse, anh gia bach và các bác trên diễn đàn có thể chi tiết cho chổ này với.

................................................................................

 

....

 

ví dụ thế này nhé: in chuổi anh "Tue_VN" khong biet su dung dau \ ra màn hình :cheers: :D

anh không thể viết

(setq chuoi "anh "Tue_VN" khong biet su dung dau \")

(princ chuoi)

mà phài viết

(setq chuoi "anh \"Tue_VN\" khong biet su dung dau \\")

(princ chuoi)

  • Vote tăng 1

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
Anh sửa lại chổ này (action_tile "accept" "(done_dialog 1)") thành

(action_tile "accept"

"(setq EDX (get_tile \"edit_X\")

EDY (get_tile \"edit_Y\"))

(setvar \"gridunit\" (list (atof EDX) (atof EDY)))

(done_dialog 1)")

.................................................

Khi giá trị hộp box Edit_X hoặc Edit_Y thay đổi, khoảng cách các Grid chưa thay đổi tương ứng.

Update Lisp :

(defun c:ex6 (/ dcl_id phepchon grid grid_X grid_Y)
 (setq DCL_ID (load_dialog "ex18-6.DCL"))
 (if (not (new_dialog "ex6" DCL_ID))
   (alert "\nKhong tim duoc file ex18-6.DCL.") )

 (setq CUR_GRID (mapcar 'getvar '("gridmode" "Gridunit")))
 ; khoi dong
 (setq grid (getvar "gridmode" )); lay bien he thong gridmode
 (if (equal (car (getvar "Gridunit"))0)
   (setq grid_X "")
   (setq grid_X (rtos(car (getvar "Gridunit")))) )
 (if (equal (cadr (getvar "Gridunit"))0)
   (setq grid_Y "")
   (setq grid_Y (rtos(cadr (getvar "Gridunit")))) )  

 (cond ;gan nut Grid va k/cach Grid
   ((= grid 0)
    (set_tile "radio_off" "1")
    (mode_tile "edit_X" 1)
    (mode_tile "edit_Y" 1) ) 
   ((= grid 1)
    (set_tile "radio_on" "1")
    (mode_tile "edit_X" 0)
    (mode_tile "edit_Y" 0)
    (set_tile "edit_X" grid_X)
    (set_tile "edit_Y" grid_Y))
   )
 ;main
 (action_tile "radio_off" "(Tat_Grid)")
 (action_tile "radio_on"  "(Bat_Grid)(gridon)");add

 (action_tile "edit_X" "(setq grid_X $value)(gridon)");add
 (action_tile "edit_Y" "(setq grid_Y $value)(gridon)");add

 (action_tile "accept" "(done_dialog 1)")
 (action_tile "cancel" "(done_dialog 0)")

 (setq phepchon (start_dialog))
 (unload_dialog DCL_ID)  
 (if (= phepchon 1)
   (cond
     ((= grid 0) (gridoff))
     ((= grid 1) (gridon))
     )
   (mapcar 'setvar '("gridmode" "Gridunit") CUR_GRID)
   )
 (princ)
)

(defun gridon ()
 (setvar "gridmode" 1)
 (setvar "Gridunit" (list (atof grid_X)(atof grid_Y))) )

(defun gridoff() (setvar "gridmode" 0))

(defun Tat_Grid()
 (setq grid 0)
 (mode_tile "edit_X" 1)
 (mode_tile "edit_Y" 1)
 (setvar "gridmode" 0)
 )

(defun Bat_Grid()
 (setq grid 1)
 (mode_tile "edit_X" 0)
 (mode_tile "edit_Y" 0)
 (set_tile "edit_X" grid_X)
 (set_tile "edit_Y" grid_Y)
 (setvar "gridmode" 1)
 )

  • Vote tăng 3

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  

×