Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Cần phải hiểu:

- Lệnh move hay các hàm move đối tượng chỉ thay đổi các thông tin về tọa độ của đối tượng. nó không fải là việc xóa đối tượng gốc rồi tạo đối tượng mới tại vị trí khác.

- Lệnh copy mà ta thường dùng là kết quả của 2 lệnh hoặc 2 hàm: copy và move. Lệnh copy chỉ tạo ra bản sao (đối tượng hoàn toàn mới nhưng có thông tin giống hệt đối tượng gốc) và tất nhiên nó cũng có cùng tọa độ với bản gốc. lệnh hoặc hàm move sau đó dùng để thay đổi tọa độ của đối tượng được tạo ra.

 

Nếu (vl-catch-all-apply 'vla-delete.... đã xóa hết đối tượng rồi thì (acet-ss-entdel sst) đưa vào làm gì nữa nhỉ?

thêm nữa. ta thường dùng vl-catch-all-apply kết hợp với vl-catch-all-error để vượt qua lỗi nếu có khả năng sảy ra. trường hợp này dùng nó đâu có ý nghĩa gì đâu

  • 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

@ketxu: hồi trước mình nhớ có 1 topic nói về Xrecord trong box autolisp này. Nhưng giờ tìm hoài không thấy. không biết có phải do các mod đã xóa nó đi hay không?

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

Thank Ketxu+Thai về lệnh move.

Tôi đã bổ sung thêm ở lisp trên để tiện check. Tôi muốn hỏi:

1). Liệu người ta có code thừa dòng (vl-catch-all-apply 'vla-delete (list sst)) không, mà có nó hay không thì cũng không thấy khác nhau?

2). Tại sao, dù có hay không có (vl-catch-all-apply 'vla-delete (list sst)) thì khi thêm dòng (acet-ss-entdel sst) đều bị lỗi?

3). Nhưng nếu thực hiện lisp xong rồi paste (acet-ss-entdel sst) vào command thì OK?

Mọi người check và giải thích giùm vớ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

Cả 2 đều sai kiểu của đối số:

- vl-catch-all-apply 'vla-delete (list sst)) tại sao có hay không thì cũng không khác nhau: Vì (list sst) không phải kiểu đối số của hàm vla-delete. hàm này không thực hiện được và trả về lỗi. nhưng vì có hàm vl-catch-all-apply nên nó bỏ qua lỗi và chạy tiếp. Nếu không có hàm này, viết dưới dạng (vla-delete (list sst)) chương trình lập tức dừng lại

- (acet-ss-entdel sst) lỗi thông báo rất rõ ràng: bad argument type: lselsetp #<VLA-OBJECT IAcadSelectionSet 2412f104>

Đối số là của nó là tập chọn SelectionSet chứ không phải vla-object SelectionSet.

- Vậy thì tại sao dán cái này (acet-ss-entdel sst) vào command vẫn OK. Vì sst trong hàm con của bạn là VLA-OBJECT AcadSelectionSet nhưng trong chương trình chính bạn đã gắn nó là SelectionSet: (setq sst (ssget)). ngay sau khi hàm con kết thúc thì nó trả giá trị cũ về cho biến sst. tức là khi bạn dán (acet-ss-entdel sst) vào command thì sst đã trở về dạng selection set.

- Tiếp. Nếu đã sử dụng vla-get-activeselectionset thì không cần viết như thế này (setq sst (ssget)). Chỉ cần thế này là đủ (ssget). Hàm vla-get-activeselectionset acdoc sẽ lấy tập hợp chọn lần cuối cùng

Ở trên tôi có nói về việc sử dụng vl-catch-all-apply. Việc sử dụng các hàm vl-catch-* không thể tùy tiện lúc nào cũng sử dụng được. Nó là con dao 2 lưỡi đối với lập trình viên. Trừ khi bạn thành thạo và hiểu rõ về nó cũng như về chương trình của bạn thì hãy dùng, khi đó nó đảm bảo cho chương trình của bạn chạy 1 cách suôn sẻ. Nhưng ngược lại, nếu bạn viết không tốt, bạn rất dễ bị rơi vào trường hợp như trên, không biết chương trình của mình bị lỗi ở đâu, và có khi nó có lỗi đấy, chương trình của bạn vẫn chạy bình thường nhưng bạn không nhận biết được lỗi đã sảy ra, dẫn đến kết quả chạy ra bị sai. nếu chương trình lớn thì việc tìm ra lỗi ở chỗ nào có khi còn vất vả hơn việc viết ra chương trì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ả 2 đều sai kiểu của đối số:

- vl-catch-all-apply 'vla-delete (list sst)) tại sao có hay không thì cũng không khác nhau: Vì (list sst) không phải kiểu đối số của hàm vla-delete. hàm này không thực hiện được và trả về lỗi. nhưng vì có hàm vl-catch-all-apply nên nó bỏ qua lỗi và chạy tiếp. Nếu không có hàm này, viết dưới dạng (vla-delete (list sst)) chương trình lập tức dừng lại

- (acet-ss-entdel sst) lỗi thông báo rất rõ ràng: bad argument type: lselsetp #<VLA-OBJECT IAcadSelectionSet 2412f104>

Đối số là của nó là tập chọn SelectionSet chứ không phải vla-object SelectionSet.

- Vậy thì tại sao dán cái này (acet-ss-entdel sst) vào command vẫn OK. Vì sst trong hàm con của bạn là VLA-OBJECT AcadSelectionSet nhưng trong chương trình chính bạn đã gắn nó là SelectionSet: (setq sst (ssget)). ngay sau khi hàm con kết thúc thì nó trả giá trị cũ về cho biến sst. tức là khi bạn dán (acet-ss-entdel sst) vào command thì sst đã trở về dạng selection set.

- Tiếp. Nếu đã sử dụng vla-get-activeselectionset thì không cần viết như thế này (setq sst (ssget)). Chỉ cần thế này là đủ (ssget). Hàm vla-get-activeselectionset acdoc sẽ lấy tập hợp chọn lần cuối cùng

Ở trên tôi có nói về việc sử dụng vl-catch-all-apply. Việc sử dụng các hàm vl-catch-* không thể tùy tiện lúc nào cũng sử dụng được. Nó là con dao 2 lưỡi đối với lập trình viên. Trừ khi bạn thành thạo và hiểu rõ về nó cũng như về chương trình của bạn thì hãy dùng, khi đó nó đảm bảo cho chương trình của bạn chạy 1 cách suôn sẻ. Nhưng ngược lại, nếu bạn viết không tốt, bạn rất dễ bị rơi vào trường hợp như trên, không biết chương trình của mình bị lỗi ở đâu, và có khi nó có lỗi đấy, chương trình của bạn vẫn chạy bình thường nhưng bạn không nhận biết được lỗi đã sảy ra, dẫn đến kết quả chạy ra bị sai. nếu chương trình lớn thì việc tìm ra lỗi ở chỗ nào có khi còn vất vả hơn việc viết ra chương trình đó.

 

 

Nếu (vl-catch-all-apply 'vla-delete.... đã xóa hết đối tượng rồi thì (acet-ss-entdel sst) đưa vào làm gì nữa nhỉ?

- vl-catch-all-apply 'vla-delete (list sst)) tại sao có hay không thì cũng không khác nhau: Vì (list sst) không phải kiểu đối số của hàm vla-delete. hàm này không thực hiện được và trả về lỗi. nhưng vì có hàm vl-catch-all-apply nên nó bỏ qua lỗi và chạy tiếp. Nếu không có hàm này, viết dưới dạng (vla-delete (list sst)) chương trình lập tức dừng lại

Nói tóm lại: tôi muốn trả lời 2 câu hỏi ở trê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

Thank Ketxu+Thai về lệnh move.

Tôi đã bổ sung thêm ở lisp trên để tiện check. Tôi muốn hỏi:

1). Liệu người ta có code thừa dòng (vl-catch-all-apply 'vla-delete (list sst)) không, mà có nó hay không thì cũng không thấy khác nhau?

2). Tại sao, dù có hay không có (vl-catch-all-apply 'vla-delete (list sst)) thì khi thêm dòng (acet-ss-entdel sst) đều bị lỗi?

3). Nhưng nếu thực hiện lisp xong rồi paste (acet-ss-entdel sst) vào command thì OK?

Mọi người check và giải thích giùm với!

Theo ketxu thì :

1. Người ta không thừa. Việc xóa tên 1 selectionset là cần thiết. Cũng giống như vlax-release-object vậy. VIệc này ngăn chặn lỗi "Selection Set Already Exists" , nếu bác nào hay viết VBA chắc cũng đôi lần gặp ^^.

 

Bác Thái bị nhầm chỗ này.

Cấu trúc gốc của hàm người ta muốn thực hiện là (vla-delete sst). Tuy nhiên, do gán Vl-catch... vào, mà hàm vl-catch... lại có ngữ pháp là (vl-catch... Hàm (list đối số)) Vì vậy, muốn test riêng hàm vla-delete thì phải bỏ list trong (list sst) đi.

Ngoài ra, vla-delete 1 vla-selectionset không xóa đối tượng nào trong vla-ss đi cả. Có sự khác nhau giữa 3 phương thức thao tác với vla-SS:

- Clear : Xóa tên các đối tượng ra khỏi vla-ss, không xóa đối tượng hình học, không xóa đối tượng vla-ss

- Delete : Xóa vla-ss, không xóa đối tượng hình học

- Erase : Xóa cả vla-ss và các đối tượng hình học

=> Bài toán của bác ĐVH có thể dùng vla-erase

 

2 + 3 : giống ý bác Thái ở bên trên : đối số ss trong acet-ss-entdel là 1 SelectionSet, không phải vla-Object SelectionSet

Hàm chính bác gắn sst thành 1 SelectionSet nhưng không loại biến, sau 1 lần chạy sst sẽ mang kiểu SelectionSet và nếu chạy (acet-ss-entdel sst ) thì tất nhiên được (nhưng nếu chạy lại lisp, lại thao tác với hàm con, thì sst lại bị gán thành vla-object)

  • Vote tăng 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

Bác Thai thông cảm! Ý tôi nói chưa rõ: Nếu (vl-catch-all-apply 'vla-delete.... đã xóa hết đối tượng rồi thì (acet-ss-entdel sst) đưa vào làm gì nữa nhỉ?

- vl-catch-all-apply 'vla-delete (list sst)) tại sao có hay không thì cũng không khác nhau. Tôi thấy 2 câu này có vẽ mâu thuẫn nhau. Vì (vl-catch-all-apply 'vla-delete. đâu có xoá gì đâ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

Lisp dưới đây dùng để hứng tập hợp chọn được sinh ra bởi lệnh copy. Tôi thêm hàm acet vào để trở thành hứng của lệnh move thì bị lỗi. Ai biết xin chỉ giùm.

Hỏi thêm 1 câu nữa: hình như dòng (vl-catch...) là thừa?

P/S (14h 14/3/2012): hiệu chỉnh để mọi người dễ kiểm tra.

(defun C:HA()
(setq sst (ssget) pt1 (getpoint "\nDiem 1: ") pt2 (getpoint pt1 "\nDiem 2: "))
(SSCP sst pt1 pt2))
(defun SSCP (sst pt1 pt2 / obj sss pto)
(vl-load-com)
(or acdoc (setq acdoc (vla-get-activedocument (vlax-get-acad-object))))
(setq lstptobj (mapcar '(lambda (x) (vlax-3d-point (trans x 1 0))) (list pt1 pt2)))
(setq sss (ssadd))
(vlax-for x (setq sst (vla-get-activeselectionset acdoc))
 (ssadd (vlax-vla-object->ename (setq obj (vla-copy x))) sss)
 (vla-move obj (car lstptobj) (cadr lstptobj)))
; (vl-catch-all-apply 'vla-delete (list sst))		;dong nay co bi thua khong???
; (acet-ss-entdel sst)				;them dong nay de del sst cu, tai sao bi loi???
sss)

Do bạn sử dụng lại tên biến sst trong thân hàm con, cụ thể :

- biến sst ở đầu vào có kiểu là : (type sst) -> PICKSET

- nhưng ở đọan giữa biến sst có kiểu là : (type sst) -> VLA-OBJECT

nên kết quả bị biến đổi không mong muốn dẫn đến khó theo dõi lỗi phát sinh (nếu có).

 

Chỉ cần đổi dòng : (setq sst (vla-get-activeselectionset acdoc))

thành (setq actSS (vla-get-activeselectionset acdoc)) thì sẽ dễ theo dõi lỗi phát sinh hơn.

 

Gửi bạn tham khảo 3 hàm con đuợc viết dựa trên hàm SSCP có cùng kết quả :

(defun SSCP1 (sst pt1 pt2 / actss lstptobj obj sss)
 (or acdoc (setq acdoc (vla-get-activedocument (vlax-get-acad-object))))
 (setq lstptobj (mapcar '(lambda (x) (vlax-3d-point (trans x 1 0))) (list pt1 pt2)))
 (setq sss (ssadd))
 (vlax-for x (setq actss (vla-get-activeselectionset acdoc))
(ssadd (vlax-vla-object->ename (setq obj (vla-copy x))) sss)
(vla-delete x); xoa VLA-object
(vla-move obj (car lstptobj) (cadr lstptobj)))
 sss)
(defun SSCP2 (sst pt1 pt2 / actss lstptobj obj sss)
 (or acdoc (setq acdoc (vla-get-activedocument (vlax-get-acad-object))))
 (setq lstptobj (mapcar '(lambda (x) (vlax-3d-point (trans x 1 0))) (list pt1 pt2)))
 (setq sss (ssadd))
 (vlax-for x (setq actss (vla-get-activeselectionset acdoc))
(ssadd (vlax-vla-object->ename (setq obj (vla-copy x))) sss)
(vla-move obj (car lstptobj) (cadr lstptobj)))
 (vla-erase actss); xoa active selection (VLA-object)
 ;(vl-catch-all-apply 'vla-erase (list actss)); xoa active selection co bay loi
 sss)
(defun SSCP3 (sst pt1 pt2 / actss lstptobj obj sss)
 (or acdoc (setq acdoc (vla-get-activedocument (vlax-get-acad-object))))
 (setq lstptobj (mapcar '(lambda (x) (vlax-3d-point (trans x 1 0))) (list pt1 pt2)))
 (setq sss (ssadd))
 (vlax-for x (setq actss (vla-get-activeselectionset acdoc))
(ssadd (vlax-vla-object->ename (setq obj (vla-copy x))) sss)
(vla-move obj (car lstptobj) (cadr lstptobj)))
 (acet-ss-entdel sst); xoa selection set
 sss)

 

Chú ý : trong t/hợp này không nên đưa hàm (vla-get-activeselectionset acdoc) vào hàm con vì như Thaistrett : "Hàm vla-get-activeselectionset acdoc sẽ lấy tập hợp chọn lần cuối cùng" do đó activeSelection (có thể) không phải là đối số sst như ta mong đợ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

Tôi có 5 dòng lisp sau đây. Hỏi: tại sao dòng 2 và 3 không lỗi mà dòng 4 và 5 bị lỗi.

(setq lay1 "A" lay2 "B")
(setq ss1 (ssget (list (cons -4 "<AND") (cons 0 "TEXT") (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) (cons -4 "OR>") (cons -4 "AND>"))))	;OK
(setq ss2 (ssget '((-4 . "<AND") (0 . "TEXT") (-4 . "<OR") (8 . "A") (8 . "B") (-4 . "OR>") (-4 . "AND>"))))				;OK
(setq ss3 (ssget '((cons -4 "<AND") (cons 0 "TEXT") (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) (cons -4 "OR>") (cons -4 "AND>"))))		;NO
(setq ss4 (ssget '((-4 . "<AND") (0 . "TEXT") (-4 . "<OR") (8 . lay1) (8 . lay2) (-4 . "OR>") (-4 . "AND>"))))				;NO

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 chú ý tác dụng của ' (quote) và (list) là khác nhau là ra vấn đề ngay mà ^^ Nó giống set và setq ý ^^

  • Vote tăng 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

Bác chú ý tác dụng của ' (quote) và (list) là khác nhau là ra vấn đề ngay mà ^^ Nó giống set và setq ý ^^

chưa hiểu ss2 và ss4?

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í dụ :

(setq  a "1" b "2"
 lst1 '(a B )
 lst2 (list a B )
 lst3 '((cons 0 a)(cons 0 B ))
 lst4 '((0 . "1")(0 . "2")))

' : Không định giá trị của các phần tử trước khi tạo list

List : định giá trị các phần tử trước khi tạo list

+ Khi dùng '(a b ) , cái mà bác thu được là list SYM (A B ) chứ không phải list giá trị của biến a, b

+ Khi dùng (list a b ), hàm list sẽ định lượng giá trị của biến a, b trước khi tạo list

 

Trong ss3 và ss4 , cái bác thu được trong Filter list là (CONS 8 LAY1)(CONS 8 LAY2) và (8 . LAY1)(8 . LAY2) chứ k phải (8 . "A")(8 . "B") như bác mong muốn

=> Thường thì người ta k để tên biến trong cặp '( ), chỉ là các giá trị tường minh như ở ss2.

  • 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

Tôi có 5 dòng lisp sau đây. Hỏi: tại sao dòng 2 và 3 không lỗi mà dòng 4 và 5 bị lỗi.

(setq lay1 "A" lay2 "B")
(setq ss1 (ssget (list (cons -4 "<AND") (cons 0 "TEXT") (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) (cons -4 "OR>") (cons -4 "AND>"))))	;OK
(setq ss2 (ssget '((-4 . "<AND") (0 . "TEXT") (-4 . "<OR") (8 . "A") (8 . "B") (-4 . "OR>") (-4 . "AND>"))))				;OK
(setq ss3 (ssget '((cons -4 "<AND") (cons 0 "TEXT") (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) (cons -4 "OR>") (cons -4 "AND>"))))		;NO
(setq ss4 (ssget '((-4 . "<AND") (0 . "TEXT") (-4 . "<OR") (8 . lay1) (8 . lay2) (-4 . "OR>") (-4 . "AND>"))))				;NO

 

chưa hiểu ss2 và ss4?

Ketxu đã nói rất rõ ràng rồi còn gì nhỉ.

- ss4: '((-4 . "<AND") (0 . "TEXT") (-4 . "<OR") (8 . LAY1) (8 . LAY2) (-4 . "OR>") (-4 . "AND>")) => trả về ((-4 . "<AND") (0 . "TEXT") (-4 . "<OR") (8 . LAY1) (8 . LAY2) (-4 . "OR>") (-4 . "AND>"))

List trên không dùng được cho hàm Ssget vì LAY1 và LAY 2 lúc này không phải kiểu chuỗi (string)

- ss3: Cũng tương tự vậy '((cons -4 "<AND") (cons 0 "TEXT") (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) (cons -4 "OR>") (cons -4 "AND>")))) => trả về ((cons -4 "<AND") (cons 0 "TEXT") (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) (cons -4 "OR>") (cons -4 "AND>")))) . không có kiểu (cons ...gì gì đó) trong điều kiện lọc filter.

Vậy phải hiểu thế nào:

- Hàm (quote....) - hay còn được viết thay thế bằng '(....)): trả về kết quả đúng như những gì bạn nhập vào nó. các biến và các hàm không được định giá trị trong hàm quote.

đễ dàng nhận thấy nếu bạn thử (setq a 1) -> (quote a) -> trả về a

- Hàm list: khác với hàm quote. tất cả các biến và các biểu thức thực hiện thông qua các hàm trung gian được định giá trị và nó sẽ trả về giá trị của các biến và hàm trung gian.

(setq a 1) -> (list a) -> trả về (1)

 

- ss2 có thể viết thế này:

(setq ss2 (ssget '((0 . "TEXT") (8 . "A,B"))))

 

ek! ketxu trả lời nhanh quá nên trả lời này thừa mất rồi

  • Vote tăng 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

Có cách nào để biết bản vẽ đã bị thay đổi so với lúc mở bản vẽ hoặc sau khi thực hiện lệnh save không các bác nhỉ.

Giống như khi ta mở bản vẽ hoặc sau khi save, chỉ cần Pan 1 nhát thôi rồi đóng bản vẽ là cad nó hỏi luôn: có lưu bản vẽ hay không ấy, nghĩa là lúc đó bản vẽ đã bị thay đổi thông tin

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ách nào để biết bản vẽ đã bị thay đổi so với lúc mở bản vẽ hoặc sau khi thực hiện lệnh save không các bác nhỉ.

Giống như khi ta mở bản vẽ hoặc sau khi save, chỉ cần Pan 1 nhát thôi rồi đóng bản vẽ là cad nó hỏi luôn: có lưu bản vẽ hay không ấy, nghĩa là lúc đó bản vẽ đã bị thay đổi thông tin

 

Biến DBMOD bá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

Có cách nào để biết bản vẽ đã bị thay đổi so với lúc mở bản vẽ hoặc sau khi thực hiện lệnh save không các bác nhỉ.

Giống như khi ta mở bản vẽ hoặc sau khi save, chỉ cần Pan 1 nhát thôi rồi đóng bản vẽ là cad nó hỏi luôn: có lưu bản vẽ hay không ấy, nghĩa là lúc đó bản vẽ đã bị thay đổi thông tin

Check sysvar DBMODE

 

Indicates the drawing modification status.

 

The setting is stored as a bitcode using the sum of the following values:

 

1 Object database modified

4 Database variable modified

8 Window modified

16 View modified

  • 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

Bài toán mà tôi muốn hỏi là như thế này:

1). Giả dụ màn hình Cad của tôi đang đặt Background ở màu "A". Vậy có cách gì để chọn một màu "B" cho các đối tượng vẽ, để nhìn rõ nhất các đối tượng này trên màn hình.

2). Vì màu Background có thể thay đổi tuỳ người dùng, nên cần phải biết quy luật đó để thay đổi màu đối tượng vẽ cho dễ nhìn nhất.

Ai biết xin chỉ giùm. 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

Bài toán mà tôi muốn hỏi như thế này:

Trong quá trình viết và test khi đang viết 1 lisp, cũng như chạy 1 lisp đã có, có thể xuất hiện lỗi và chương trình bị break.

Khi lỗi thường kèm theo 1 dòng thông báo. Tuy nhiên dòng thông báo này không cho ta biết lỗi ở hàm nào của lisp và nó nằm ở vị trí nào trong lisp.

Vậy có thể viết 1 đoạn code ngoại trú hoặc nội trú trong 1 chương trình, để nếu khi có lỗi xãy ra thì nó cho ta biết được tên hàm (và vị trí của hàm nếu trong chương trình có nhiều hàm cùng tên) bị 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

Cách mà bác hỏi người ta dùng cho thời trước năm 2000 khi mà chưa có Vlisp hỗ trợ viết code, bằng cách đặt các hàm bẫy lỗi trong code. tuy nhiên đó vẫn là cách làm rất cực khổ cho lập trình viên.

còn giờ chúng ta cách thời đó những 13 năm và chúng ta có Vlisp. Mình hướng dẫn sơ qua:

- bác dùng Vlisp để viết code. (gõ lênh vlide trong cad)

- tại cửa sổ vlisp editor, bác nghi ngờ chỗ nào lỗi thì đặt con trỏ vào vị trí đầu hàm rồi bấm F9 để tạo 1 BreakPoint. hiểu nôm na thì nó là 1 điểm dừng cho quá trình chạy lisp.

- tải code từ vlisp editor vào bản vẽ bằng cách gõ lệnh tắt Ctrl+alt+E hoặc bấm chuột vào nút tren menu có hình bình hành và 1 mũi tên chỉ xuống để load (tooltip của nút đó là load active edit window. bác thông cảm, mình ngại chụp hình)

- trở về cửa sổ cad. bác gõ tên lệnh, chương trình sẽ chạy đến điểm BreakPoint thì dừng lại. (tất nhiên nếu nó chưa gặp lỗi trước đó)

- lúc này cửa sổ vlisp editor mặc định được gọi, trên menu bác tìm nút có tooltip "watch window", bật nó lên

- trong cửa sổ hiện ra bác bấm tiếp nút addwatch, bấm mũi tên chọn *last-value* <- đây là giá trị trả về sau khi mỗi hàm autolisp được thực hiện. ngoài ra bác có thể gõ tên các biến hoặc 1 đoạn code gồm các hàm và các biến vào đây và chọn OK để đưa vào danh sách theo dõi giá trị trả về.

- OK, để nguyên cái cửa sổ watch đấy. quay lại code của bác ở vlisp editor. bác bấm nút có tooltip "step to" để chạy phần còn lại của code từng bước 1 đồng thời theo dõi giá trị của *last-value* ở cửa sổ watch. cứ thế bấm cho đến khi gặp lỗi, hàm dừng lại, nó sẽ giữ con trỏ chuột và bôi đen hàm bị lỗi. sau đó xử lý thế nào thì tùy bác.

1 vài chú ý:

- nên đặt breakpoint ngay đầu code nếu không đoán được nó lỗi ở đâu. có thể đặt vài điểm breakpoint 1 lần.

- cần tìm hiểu cách sử dụng linh hoat 3 nút "step to" "step out" "step over" để có thể tìm thấy lỗi nhanh nhất.

- khi kiểm tra lỗi bằng cách này. các hàm không tên tạo bằng hàm lambda cần fải được đặt trong hàm function, nghĩa là: không được viết thế này '(lambda ...) mà fải viết thế này (function (lambda...)) thì mới kiểm tra được các giá trị trả về trong quá trình chạy hàm không tên.

- bật và tắt điểm breakpoint đều dùng chung 1 phím F9.

.... và rất nhiều vấn đề nữa, nhưng mình chỉ nói đến đây thôi. bác tự tìm hiểu thêm

  • 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

các bác PRO cho em hỏi chút nhé :D

biến " osmode " 4287 có ý nghĩa gì ạ,em lùng sục mãi mà chưa tìm ra.

và "orthomode" ,chưa biết ý nghĩa của biến này,lúc đầu gán một giá trị cho biết này,thì kết quả trả về là bao nhiêu ạ.

em mới học autolisp chưa biết nhiều,mong các bác đừng cười nhé :huh: :huh: :rolleyes:

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 chế độ bắt điểm của cad được quy định bằng các bitcode như sau:

0 NONe

1 ENDpoint

2 MIDpoint

4 CENter

8 NODe

16 QUAdrant

32 INTersection

64 INSertion

128 PERpendicular

256 TANgent

512 NEArest

1024 Clears all object snaps

2048 APParent Intersection

4096 EXTension

8192 PARallel

Tại 1 thời điểm bạn có thể thiết lập nhiều chế độ bắt điểm cùng lúc. khi đó giá trị của biến Osmode sẽ bằng tổng các bitcode tương ứng của các chế độ bắt điểm trên

Ví dụ. nếu bạn thiết lập đồng thời 2 chế độ bắt điểm: ENDpoint và CENter thì biến Osmode sẽ có giá trị là 1+ 4 =5

  • Vote tăng 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

các bác PRO cho em hỏi chút nhé :D

biến " osmode " 4287 có ý nghĩa gì ạ,em lùng sục mãi mà chưa tìm ra.

và "orthomode" ,chưa biết ý nghĩa của biến này,lúc đầu gán một giá trị cho biết này,thì kết quả trả về là bao nhiêu ạ.

em mới học autolisp chưa biết nhiều,mong các bác đừng cười nhé :huh: :huh: :rolleyes:

4287=1+2+4+16+32+128+4096

Bạn vào Express => Tools => System variable editor để biết cụ thể giá trị và ý nghĩa của 2 biến trên

  • 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

Bài toán mà tôi muốn hỏi như thế này:

Trong quá trình viết và test khi đang viết 1 lisp, cũng như chạy 1 lisp đã có, có thể xuất hiện lỗi và chương trình bị break.

Khi lỗi thường kèm theo 1 dòng thông báo. Tuy nhiên dòng thông báo này không cho ta biết lỗi ở hàm nào của lisp và nó nằm ở vị trí nào trong lisp.

Vậy có thể viết 1 đoạn code ngoại trú hoặc nội trú trong 1 chương trình, để nếu khi có lỗi xãy ra thì nó cho ta biết được tên hàm (và vị trí của hàm nếu trong chương trình có nhiều hàm cùng tên) bị lỗi?

Ko biết bạn biết Lee-mac ko?

Nhưng bạn nên xem cái này nếu chưa tìm ra: http://lee-mac.com/debugvlide.html

Ko hiểu English thì có thể nhờ Mr. Google

Good luck!

  • 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

Ko biết bạn biết Lee-mac ko?

Nhưng bạn nên xem cái này nếu chưa tìm ra: http://lee-mac.com/debugvlide.html

Ko hiểu English thì có thể nhờ Mr. Google

Good luck!

Ồ! Đọc gần hết kho báu của nhà Lee rồi, thậm chí cái này cũng đọc rồi (mà chỉ lướt qua). Bây giờ bạn nhắc mới hỡi ôi, quen quá!

Cám ơn rất 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

Có cách nào để lấy list của tất cả Font name trong Cad không nhỉ?

(liệt kê tất cả font name mà cad có thể dùng, thể hiện trong lệnh style)

Tôi loay hoay mãi mà chưa tìm ra.

Thanks!

  • 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

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

×