Đến nội dung


Hình ảnh
- - - - -

[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


  • Please log in to reply
44 replies to this topic

#21 anhcos

anhcos

    biết lệnh hatchedit

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

Đã gửi 19 January 2013 - 11:05 PM

Một ngôn ngữ không có cấu trúc dữ liệu, không có trình biên dịch và là lập trình cấp thấp nên khả năng bẫy lỗi rất kém, chỉ có cải tiến được đôi chút thôi. Với các tiện ích nhỏ thì lisp khá hữu dụng, nhưng lớn lên một chút là khác hẳn, về lâu dài lisp không thể đáp ứng cầu của một lisper thích khám phá.
  • 0
Clear sky!

MF Rock collection.

#22 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 19 January 2013 - 11:29 PM

Bạn nói y hệt mấy cậu sinh viên mới ra trường ở cty mình. Thực ra lisp với mình cũng chỉ để viết mấy lệnh nho nhỏ chơi thôi. Ngành thoát nước của mình cũng không cần nhiều phần mềm lắm. Phần mềm lớn quá thì bảo anh Sếp chi tiền mua bản quyền để dung chứ bản than mình cũng ngại, không dành được nhiều thời gian cho các dự án lớn về lisp hay lập trình phần mềm nói chung.
  • 0

#23 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 January 2013 - 07:11 AM

Một ngôn ngữ không có cấu trúc dữ liệu, không có trình biên dịch và là lập trình cấp thấp nên khả năng bẫy lỗi rất kém, chỉ có cải tiến được đôi chút thôi. Với các tiện ích nhỏ thì lisp khá hữu dụng, nhưng lớn lên một chút là khác hẳn, về lâu dài lisp không thể đáp ứng cầu của một lisper thích khám phá.

Cũng chưa chắc bác ạ. Lisp chỉ hạn chế ở hộp thoại DCL thôi, khả năng bắt lỗi, bẫy lỗi không đến nỗi nào
Quan trọng là ý tưởng đưa ra đấy bác ạ. Như Tue_NV thấy lập trình bằng ngôn ngữ nào đi chăng nữa cái Ý tưởng vẫn là số 1 và cách quản lý, sử dụng các hàm con để sau này dễ dàng chỉnh sửa là được
Công bằng mà nói, thao tác về hộp thoại trên NET là hiệu quả nhất, nhưng về mặt xử lý hàm, biến, bắt bẫy lỗi, sự mềm dẻo, linh hoạt khi coding thì sử dụng ngôn ngữ Lisp vẫn đầy hiệu quả, kể cả với 1 chương trình lớn
  • 0

#24 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 20 January 2013 - 01:24 PM

Tôi không nói với bạn nhiều. Tôi chỉ có 1 nhận xét để bạn vui và 1 nhận xét để bạn buồn:
Vui trước: bạn là người giỏi nhất CV đấy.
Buồn sau: bạn là người tự cao tự đại nhất CV đấy.
Nhắc lại: code tôi post lên không phải là code của tôi để so sánh với bạn.

Sorry, sờ-pam một chút.

"- người giỏi nhất CV là : tôi."
"- người tự cao tự đại nhất CV dĩ nhiên không phải là ... tôi. "

Chú ý : đoạn trên được trích từ nhật kí của một lập trình viên tiêu biểu. (Not me) :mellow:
Bạn có đông ý với quan điểm của lập trình viên này không ?
(nếu câu trả lời là không, có thể bạn chưa phải là lập trình viên)
  • 2

#25 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 22 January 2013 - 03:10 PM

Một ví dụ đơn giản cho Nhóc hiểu nhé.
Giả sử Nhóc viết 1 lệnh vẽ line bằng command trong đó có thay đổi các biến hệ thống OSMODE (tắt bắt điểm) và ORTHOMODE (tắt vẽ chế độ vẽ theo trục tọa độ). Khi đó Nhóc viết thế này:

(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))
(command "line" p p1"")
(done-defun lst));end vd
Giải thích:
- Việc lấy các giá trị ban đầu của các biến hệ thống OSMODE và ORTHOMODE do hàm start-defun đảm nhận và lưu giá trị vào biến lst
- Việc trả lại các giá trị ban đầu cho các biến trên sẽ do hàm done-defun đảm nhận khi kết thúc lệnh
- Nếu nhấn esc giữa chừng thì hàm con *error* (đã khai báo ben trong hàm start-defun) được gọi. nó sẽ thực hiện thao tác undo back về thời điểm trước khi gõ lệnh
* Về bản chất thì nó giống như cách ĐVH hướng dẫn nhóc, nhưng cách này gọn gàng hơn, sẽ khiến Nhóc đỡ cực hơn khi viết.
=================================================
PS: Thêm 1 chút cho các bạn chưa biết:
"Nếu có lỗi" như ĐVH nói thì TL chỉ biết 1 trường hợp duy nhất có thể sảy ra lỗi là do hàm *error* không được gọi khi nhấn Esc. Nguyên nhân do tại thời điểm nhấn Esc, Cad đang ở trạng thái Active command. (sự kiện vlr-commandWillStart). Như ở Mục 1 TL đã nói về hàm *error*, nó chỉ được gọi khi chạy lệnh lisp.
Vì vậy, nếu lỗi là do trường hợp này thì chỉ cần khắc phục như sau chứ không cần tìm cách khác: Nếu trong lisp có sử dụng command thì không nên cho hàm lisp vào trong command nữa. Như trong ví dụ trên thì không nên viết như thế này (command "Line" (getpoint) (getpoint) "")
Ngoài lỗi này thì TL chưa bao giờ gặp lỗi nào khác

Khi thêm repeat trước command, và nhấn esc khi đang lặp thì biến hệ thống không trả về giá trị cũ. TL xem lại nhé!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#26 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 22 January 2013 - 04:40 PM

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

#27 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 22 January 2013 - 05:10 PM

Ồ không! Mình không tải từ Vlide đâu. Tải từ AP đấy.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#28 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 22 January 2013 - 05:43 PM

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

#29 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 22 January 2013 - 06:15 PM

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

#30 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 January 2013 - 06:32 PM

Ồ, 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 ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#31 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 22 January 2013 - 09:41 PM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#32 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 January 2013 - 06:13 AM

#15 bác ơi ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#33 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 23 January 2013 - 08:03 AM

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

@Ketxu: (edit : mình lại nhầm ^^)
  • 0

#34 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 23 January 2013 - 09:38 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#35 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 23 January 2013 - 10:15 AM

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

#36 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 January 2013 - 10:23 AM

Ồ, đọ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!
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#37 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 23 January 2013 - 10:35 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#38 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 23 January 2013 - 11:38 AM

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

#39 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 January 2013 - 12:29 PM

À mình đã hiểu ý TL ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#40 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 23 January 2013 - 12:29 PM

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 ^^
  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^