Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
ThuyLinh313

[Thảo luận] - Kiểm soát lỗi (có thể) phát sinh khi người dùng nhấn Esc để thoát lệnh

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

Lỗi này trước đây mình gặp rồi mà quên mất không nhắc đến nó. Nghe có vẻ khó tin nhưng lỗi không phải do thuật toán của mình mà do... Vlide. Khi bật Vlide lên, nó đã tác động "1 cái gì đó" vào *error* nên hoạt động không còn bình thường nữa. Bạn gặp lỗi trên là do tải lisp trực tiếp từ Vlide. Lỗi này không chỉ phương pháp của mình dính mà tất cả các lisp có sử dụng *error* đều dính.

 

Bạn có thể kiểm chứng bằng cách tắt cad đi, đừng bật Vlide, tải file Ví dụ có vòng lặp vào bằng lệnh AP để test sẽ thấy *error* trả lại các thiết lập bình thường.

 

Ngoài ra, ở trang trước Ketxu có nêu 1 vài phương án khắc phục, bạn thử sửa theo ketxu mách xem thế nào. mấy hôm rồi mình bận với cái lisp bật tắt tiếng việt nên chưa có thời gian sửa.

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

Thế thì mình chịu. vì bên máy của mình chỉ lỗi trong trường hợp mình tải từ Vlide. Nhờ mọi người test lại vậy. Bạn có thể post code bạn đã sửa VD lên không? có thể mình đã viết khác bạn nên không gặp lỗi như mô 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

Bạn TL hay quá ^^

Mình góp thêm 1 chút : một hàm con, hay 1 biến khi đã được định nghĩa là cục bộ, thì khi kết thúc hoặc ngắt lệnh (kể cả bình thường hay ESC), giá trị của biến/ hàm sẽ trả về như cũ (như trước khi chạy hàm mẹ)

Vì vậy bước lưu giữ trạng thái của hàm *error* là không cần thiết

Hôm nay mình gặp 1 trường hợp đặc biệt không tuân theo ý trên của Ketxu. Lúc nào bạn rảnh thì ngó qua lisp bật tắt bộ gõ tiếng việt ver2.1 của mình nhé. Bạn tìm trong đó hàm callback-doubleClick. nếu mình sử dụng 1 biến để lưu giá trị trả về của (setq ss (vla-add sset "ThuyLinh313")) và sau đó khai báo ss là biến cục bộ. Sau khi lệnh kết thúc giá trị của ss vẫn không được trả về như cũ, nó vẫn là 1 tập chọn vla-sset. Mình đang phải tạm khắc phục bằng cách khử giá trị của nó về tập rỗng (vla-delete (vla-item sset "ThuyLinh313"))

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ó không đặc biệt đâu TL, nếu bạn viết VBA thì sẽ thấy ^^. Trong trường hợp này nil khác và vla-release khác, dòng này không thừa khi dùng visual và không phải lỗ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

Thế thì mình chịu. vì bên máy của mình chỉ lỗi trong trường hợp mình tải từ Vlide. Nhờ mọi người test lại vậy. Bạn có thể post code bạn đã sửa VD lên không? có thể mình đã viết khác bạn nên không gặp lỗi như mô tả.

Trong VD của mình Code nó chỉ là: thêm (repead 5000... ) và trong khi đang chạy mình nhấn esc xem sao, thì nó vậy.

(defun Start-defun (lst-var)
(defun *error* (msg)
 (redraw)
 (command "undo" "end")
 (command "undo" "")
 (princ))
(command "undo" "begin")
(mapcar '(lambda(x) (list x (getvar x))) lst-var))
(defun Done-defun (lst-var / )
(mapcar '(lambda (x) (setvar (car x) (cadr x))) lst-var)
(command "undo" "end")
(princ))
(defun C:VD (/ lst *error* p p1)
(setq lst (start-defun '("OSMODE" "ORTHOMODE")))
(setvar "osmode" 0) (setvar "orthomode" 0)
(setq p (getpoint) p1 (getpoint p))
(repeat 5000
(command "line" p p1 "") )
(done-defun lst));end vd

Nhờ mọi người test giùm 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

Cái này Ketxu nói ở bài trước rồi bạn ạ. (command "line" p p1 "") thay bằng (vl-cmdf "line" p p1 "")

@ThuyLinh313: Cho dù Ketxu có nói ở #15 thì TL cũng nên test thử xem sao nhé! Chả được gì nếu dùng vl-cmdf đâu!

@Ketxu: có quẳng hết tất cả command ra khỏi lisp và thay bằng vla thì với lisp của TL cũng không trả biến lại khi nhấn esc đâu.

Lỗi do chương trình tự gây ra và lỗi do bấm esc khác nhau lắm!

  • 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

Mình nghĩ là chỉ bị trên mỗi máy của ĐVH. Trước khi post bài trên mình đã thử trên máy của mình và máy của các đồng nghiệp (không bật vlide - các bản cad từ 2005 - 2010) tất cả chạy ngon lành. Bạn có thể test trên máy của người khác (không tải trước bất kỳ lisp nào của bạn) để kiểm tra.

Ngoài ra, nếu dùng phương pháp trên vẫn bị lỗi, liệu bạn có phương án nào khác để thay thế mà không bị lỗi hay không? kể cả phương án bạn post trong link 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

Ồ, đọc code thấy TL để done rời ra à ^^ Nên để vào trong error và cuối lisp gọi thẳng nó ra nhé. Có nghĩa là, dù lỗi hay không lỗi, việc reset đều phải làm!

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

Mình nghĩ là chỉ bị trên mỗi máy của ĐVH. Trước khi post bài trên mình đã thử trên máy của mình và máy của các đồng nghiệp (không bật vlide - các bản cad từ 2005 - 2010) tất cả chạy ngon lành. Bạn có thể test trên máy của người khác (không tải trước bất kỳ lisp nào của bạn) để kiểm tra.

Ngoài ra, nếu dùng phương pháp trên vẫn bị lỗi, liệu bạn có phương án nào khác để thay thế mà không bị lỗi hay không? kể cả phương án bạn post trong link trước.

Mình bí phương pháp, chứ nếu biết thì đã up lên rồi! Thể theo yêu cầu của bạn mình test thử trên 6 máy: 3 máy xài WinXP, 3 máy xài Win7. Kết quả quá bất ngờ:

3 máy xài Win7: OK

3 máy xài WinXP: lỗi.

Có phải TL đang xài Win7?

Nếu như thế thì lỗi này khó hiểu quá!

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

Thế thì mình đầu hàng với lỗi này rồi. Toàn bộ máy tính ở cơ quan mình đều dùng XP và không lỗi. Vừa test thử laptop của em trai, cad 2007 + win8 thì lần đầu tiên được diện kiến lỗi này. có thể lỗi do cấu hình phần cứng.(?)

@ketxu: bạn chưa đọc kỹ toàn bộ lisp của mình:

- Hàm start: đặt ở đầu lisp, đánh dấu undo begin, lấy toàn bộ giá trị biến hệ thong sẽ thay đổi trong lisp và Định nghĩa *error*.

- Hàm Done: đặt cuối lisp,đánh dấu undo end, trả lại toàn bộ giá trị ban đâu của các biến hệ thong đã thay đổi.

- Nếu sảy ra lỗi, hàm *error* thực hiện việc đánh dấu undo end và thực hiện thao tác undo. Bản thân thao tác này đã trả lại giá trị ban đầu cho các biến hệ thong và các thiết lập khác (tọa độ màn hình, ucs...) nên không cần nhét hàm done vào *error* nữa.

  • 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

Nhoc xin tài lanh tí ^^, nhoc đã thử vd của anh HA,máy nhoc win 7, thử tip trên máy khác win xp lun cùng 1 phương thức.

Thứ 1 sau khi chạy lsp vừa pick điểm đầu tiên xong pick tiếp điểm còn lại, chạy như điên :D

Command: line Specify first point:

Specify next point or [undo]:

Specify next point or [undo]:

Command: line Specify first point:

Specify next point or [undo]:

Specify next point or [undo]:

Command: line Specify first point:

Specify next point or [undo]:

Specify next point or [undo]:

Command: line Specify first point:

Specify next point or [undo]:

Specify next point or [undo]:

Command: line Specify first point:

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

Chạy xong >>>trả lại biến đc

-Lần thứ 2 chưa pick điểm còn lại nhấn esc giữa chừng >>>>hàm của chị TL vẫn hoạt động tốt.

-Lần thứ 3 đã pick điểm còn lại trong lúc nó đang chạy như trên nhoc esc đột ngột ^^ >>>hàm error hết hoạt động

Ps: ko biết kết luận thế nào vì ko hỉ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

Mình tiếp tục update phương pháp kiểm soát lỗi. Các hàm mới tối ưu hơn, gọn gàng hơn, thuật toán cao cấp hơn và quan trọng là kiểm soát lỗi tốt hơn 2 phương pháp trước. B)

Cách sử dụng:

(defun c:tenlenh (/ lst-var biến_cục_bộ_khác)

(setq lst-var (start-defun danh_sách_biến_hệ_thống)

........... nội dung lisp..........

(done-defun lst-var)) ;end

defun start-defun (lst-var / err)
 (setvar "cmdecho" 0) 
 (vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
 (setq err *error*
       *error* (lambda (msg)
                (redraw)
                (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
                (vl-cmdf "u")
                (setq *error* (car lst-var))))
 (list err (mapcar (function (lambda (x) (list x (getvar x)))) lst-var)));end


(defun done-defun (lst-var / )
 (mapcar (function (lambda (x) (setvar (car x) (cadr x)))) (cadr lst-var))
 (setq *error* (car lst-var))
 (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
 (princ));end

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

Thuật toán cao cấp... bình thường !

Anh k biết nó chạy thực tế ntn nhưng nhìn qua cũng biết nó k thể dùng được với trường hợp có sử dụng reactor trong lisp.

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

Lười vậy?

nghĩa là hàm trên không có tác dụng với reactor chứ sao. Chỉ thao tác undo không thôi thì không thể xóa được 1 reactor khi nó đã được tạo ra. Kể cả khi không thiết lập nó ở trạng thái bền vững.

em cứ thử nhét 1 hàm tạo reactor vào giữa 2 hàm trên của em. sau khi tao xong reactor, nhấn esc để thoát rồi dùng lệnh RRA của anh kiểm tra mà xem nó có được gỡ khỏi bản vẽ không.

  • 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

:P Mình đang bận chứ không phải lười nhé. Xác nhận đúng là undo không thể loại bỏ reactor.

Thôi kệ. Cadviet không nhiều người sử dụng reactor nên mình không viết cho reactor nữa. Ai có nhu cầu mà gặp khó khăn thì có thể liên hệ mì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

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  

×