Đến nội dung


Hình ảnh
- - - - -

tạo dialog


  • Please log in to reply
16 replies to this topic

#1 hungfrank

hungfrank

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 29 August 2008 - 09:30 AM

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
  • 0

#2 Nộ Thiên

Nộ Thiên

    biết lệnh ddedit

  • Members
  • PipPipPipPip
  • 297 Bài viết
Điểm đánh giá: 133 (tàm tạm)

Đã gửi 29 August 2008 - 10:22 AM

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"))
  • 0

#3 hungfrank

hungfrank

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 29 August 2008 - 11:13 AM

(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.
  • 0

#4 Nộ Thiên

Nộ Thiên

    biết lệnh ddedit

  • Members
  • PipPipPipPip
  • 297 Bài viết
Điểm đánh giá: 133 (tàm tạm)

Đã gửi 29 August 2008 - 11:19 AM

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 "/" = "\\"
  • 0

#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 December 2009 - 05:46 AM

....
(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.
  • 0

#6 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 01 December 2009 - 07:39 AM

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
  • 1

#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 December 2009 - 10:56 AM

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.c...les/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.c...amp;#entry71018
Rất mong sự giúp đỡ của mọi người.

Tue_NV xin cảm ơn.
  • 0

#8 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 01 December 2009 - 01:24 PM

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
  • 1

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 01 December 2009 - 01:51 PM

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

  • 1

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 December 2009 - 06:23 AM

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 (< 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)
(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.
  • 0

#11 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 02 December 2009 - 08:49 AM

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

  • 1

#12 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 December 2009 - 11:01 AM

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.c...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.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#13 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 02 December 2009 - 12:10 PM

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

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

  • 0

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 December 2009 - 02:05 PM

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

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
  • 0

#15 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 December 2009 - 02:56 PM

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.c...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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#16 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 02 December 2009 - 02:57 PM

..............
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)
  • 1

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#17 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 02 December 2009 - 03:18 PM

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

  • 3