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

Nhờ chỉnh giúp lisp ðiều khiển Dialog

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

Em ðang viết cái lisp con con ðể thiết lập các thông số cho bản vẽ và tuyến trên bản vẽ, nhýng quả thật em rất gà mờ trong việc ðiều khiển Dialog nhờ các bác chỉ giúp ðể cái lsp của em nó chạy ðýợc.

Hộp thoại của em nhý thế này:

(Không load ðc ảnh, các bác xem trong file ðính kèm vậy)

Trong ðó: Nếu chýa có tim tuyến hiện thời nào thì ðể trống, còn có thì nó hiện tên (Cái này chỉ ðể biết cái ðang hiện thời thôi) em muốn chỉ cho thấy chứ không gõ vào ðýợc nhý cái em ðang làm.

Nếu chýa có tuyến hiện thời hoặc có rồi nhýng không phải tuyến mình làm việc thì chọn lại. Nhýng ðến cái buton "Chon tuyen" này thì nó không chịu chạy cái hàm mà em gán cho nó. Nhờ các bác chỉ giúp em phải làm thế nào thì nó mới chịu chạy, nó chạy rồi thì lấy kết quả hiện lên cái tim tuyến hiện thời.

Còn 3 cái phía dýới thì em gán cho các biến thýờng trực trong bản vẽ ðể khi cân lôi lên thôi, không vấn ðề gì.

Mong các bác bớt chút thời gian giúp em, và chỉ cho em cách làm việc với thằng buton này cho hiệu quả. Cảm õn các bác nhiều.

 

http://www.cadviet.com/upfiles/3/123735_dialog.rar

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 vẫn còn cái để hỏi các bác, mong các bác giải thích cho em hiểu cái khúc mắc này cái. Em mới viết, mà lại chủ yếu học mót nên gà mờ lắm.

Em học theo cái lsp của bác nào đó để gọi lại dialog khi click vào buton bằng vòng lặp While nhưng không hiểu sao cái của bác đó dùng điều kiện của vòng while là (not (vl-position Flag '(1 0))) thì OK.

Vậy mà em dùng điều kiện là (>= Flag 2) thì nó lại không chịu chạy.

Mặc dù theo em hiểu thì khi (done_dialog 2) trả về là 2 thì:

Với cú pháp  (not (vl-position Flag '(1 0))), thì  (vl-position Flag '(1 0)) sẽ trả về nil và (not nil) = T

Với kiểu của em làm là (>= flag 2) cũng = T

Vậy sao cái bác làm thì nó chạy mà em làm thì nó lại không chịu chạy cho.

http://www.cadviet.com/upfiles/3/123735_loadks_dialog.lsp

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 vẫn còn cái để hỏi các bác, mong các bác giải thích cho em hiểu cái khúc mắc này cái. Em mới viết, mà lại chủ yếu học mót nên gà mờ lắm.

Em học theo cái lsp của bác nào đó để gọi lại dialog khi click vào buton bằng vòng lặp While nhưng không hiểu sao cái của bác đó dùng điều kiện của vòng while là (not (vl-position Flag '(1 0))) thì OK.

Vậy mà em dùng điều kiện là (>= Flag 2) thì nó lại không chịu chạy.

Mặc dù theo em hiểu thì khi (done_dialog 2) trả về là 2 thì:

Với cú pháp  (not (vl-position Flag '(1 0))), thì  (vl-position Flag '(1 0)) sẽ trả về nil và (not nil) = T

Với kiểu của em làm là (>= flag 2) cũng = T

Vậy sao cái bác làm thì nó chạy mà em làm thì nó lại không chịu chạy cho.

http://www.cadviet.com/upfiles/3/123735_loadks_dialog.lsp

Hề hề hề,

Bạn xem lại biến flag của bạn.

Bởi (setq flag (start_dialog))

Vậy cái biến này có thể lấy giá trị 2 không hè????

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

Hề hề hề,

Bạn xem lại biến flag của bạn.

Bởi (setq flag (start_dialog))

Vậy cái biến này có thể lấy giá trị 2 không hè????

Bác giải thích cho em rõ hơn tý được không. 

Em đang hiểu nó sẽ tra về 0 nếu cancel và 1 nếu accept và gtri nếu mình đặt cho done_dialog .

Vậy thì chỉ khi mình click mới có gtri >=2 chư?

Với lại cho em hỏi thêm tý.

Cad của em mới phát sinh cái lỗi là khi thực hiện phép tính chia chỉ trả về kết quả là phần nguyên chứ phần thập phân thì coi như nó vứt hết.

VD (/ 1 3) =0, (/ 2 3) =0, (/ 4 3) =1, (/ 5 3) =1

$ (/ 1 3)
0
_$ (* 2.123 2)
4.246
_$ (/ 2 3)
0
_$ (/ 1 3)
0
_$ (/ 4 3)
1
_$ (/ 5 3)
 
$ (/ 1 3)
0
_$ (* 2.123 2)
4.246
_$ (/ 2 3)
0
_$ (/ 1 3)
0
_$ (/ 4 3)
1
_$ (/ 5 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

 

Bác giải thích cho em rõ hơn tý được không. 

Em đang hiểu nó sẽ tra về 0 nếu cancel và 1 nếu accept và gtri nếu mình đặt cho done_dialog .

Vậy thì chỉ khi mình click mới có gtri >=2 chư?

Với lại cho em hỏi thêm tý.

Cad của em mới phát sinh cái lỗi là khi thực hiện phép tính chia chỉ trả về kết quả là phần nguyên chứ phần thập phân thì coi như nó vứt hết.

VD (/ 1 3) =0, (/ 2 3) =0, (/ 4 3) =1, (/ 5 3) =1

$ (/ 1 3)
0
_$ (* 2.123 2)
4.246
_$ (/ 2 3)
0
_$ (/ 1 3)
0
_$ (/ 4 3)
1
_$ (/ 5 3)
 
$ (/ 1 3)
0
_$ (* 2.123 2)
4.246
_$ (/ 2 3)
0
_$ (/ 1 3)
0
_$ (/ 4 3)
1
_$ (/ 5 3)

Hề hề hề,

Cái lỗi phép chia là không phải đâu. Theo dịnh nghĩa của lisp thì khi chia số nguyên cho sốn nguyên sẽ được kết quả là số nguyên, Muốn lấy số thực ở kết quả thì một trong 2 số bị chia và số chia phải là số thực.

Nếu muốn có 1.5 ở kết quả thì (/ 3 2.0) hoặc (/ 3.0 2)

 

về hộp thoại mình cũng không rành lắm nhưng hình như (start_dialog) chỉ nhận các giá trị 0 và 1 mà thôi. Cái này hoàn toàn khác với biến ddialog bạn ạ. Biến ddialog thì bạn có thể cho nó các giá trị thoải mái khi kích hoạt các button.

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 bác phamthanhbinh  nhiều, thế mà em cứ tưởng nó lỗi.

 

 

Lúc mới gọi dialog lên thì flag=nil >> (>= flag 2)=nil

Hỏi thêm bác tý, em đã thử (setq flag 2) trước vòng while rồi nhưng nó vẫn không chịu chạy nghĩa là sao hả bác. Mặc dù hiện tại em dùng cách của bác nào đó thì nó vẫn chạy, lsp của em vẫn OK nhưng em muốn hiểu cho cụ tỷ hơn tý về thằng này. Mong bác giúp đỡ.

Em đang học mà ngu nhất là món dialog và mấy hàm vl-xxxxx. Lỡ có hỏi nhiều thì các cũng cố giúp nhé

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

Vậy thì bạn gởi lên đây:

1). File dcl

2). File lisp chạy được, kèm những dòng edit nào khiến nó không chạy được.

3). Và: không chạy được cụ thể là như thế nào?

---

P/s: dòm sơ qua file thì bạn thử làm cách này xem:

(setq flag 3)

(while (> flag 2)...

...

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

http://www.cadviet.com/upfiles/3/123735_loadks_dialog_1.lsp

 

Đây là file em chạy được. Nhưng nếu em thay đoạn

(while (not (vl-position Flag '(1 0)))

bằng 

(setq flag 2)

(While (>= flag 2)

thì nó không chịu chạy

Bác xem giúp em lý do sao nó không chạy đc vì theo ngu ý của em thì cái thứ 2 tổng quát hơn trong trường hợp dialog có nhiều buton thì dùng cái này có vẻ dễ chịu hơn (không biết có đúng không nữa). Bác giải thích giúp cho.

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òm sơ qua file thì bạn thử làm cách này xem:


(setq flag 3)


(while (> flag 2)...


...


Còn vẫn chưa được thì bạn gởi lên đây:


 

1). File dcl


2). File lsp chạy được, kèm những dòng edit nào khiến nó không chạy được.


3). Và: không chạy được cụ thể là như thế nào?


---

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

Không hiểu nội dung dialog của bạn làm gì >> Không hiểu khái niệm "không chạy được" khi bạn (setq flag 2) và (while (>= flag 2)

Bạn có thể giải thích khái niệm "không chạy đượ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

Nó treo luôn bác à, không thoát ra khỏi cái Dialog đó được.

Nội dung Dialog thì em đã giải thích ở bài trên cùng rồi nhờ bác liếc qua tý.

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

File của bác thì chạy OK, không biết em sai chỗ nào mà nó không chịu chạy.

Để em kiểm tra lại xem cái chỗ ngu ngu đó nó nằm ở đâu. Cảm ơn bác nhiều.

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  

×