Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2848 replies to this topic

#1101 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 14 March 2012 - 01:25 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1102 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 14 March 2012 - 01:40 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1103 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 14 March 2012 - 02:17 PM

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


#1104 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 14 March 2012 - 05:57 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1105 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 14 March 2012 - 09:50 PM

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


#1106 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 14 March 2012 - 11:00 PM

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

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


#1107 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 15 March 2012 - 06:23 AM

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


#1108 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 15 March 2012 - 08:51 AM

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

#1109 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 16 March 2012 - 11:32 AM

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

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


#1110 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 March 2012 - 11:54 AM

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 ý ^^
  • 2

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


#1111 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 16 March 2012 - 12:14 PM

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


#1112 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 March 2012 - 12:34 PM

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

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


#1113 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 16 March 2012 - 12:58 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1114 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 16 March 2012 - 01:18 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1115 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 March 2012 - 01:23 PM

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

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


#1116 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 16 March 2012 - 01:30 PM

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

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#1117 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 18 March 2012 - 03:56 PM

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


#1118 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 24 March 2012 - 05:00 PM

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


#1119 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 24 March 2012 - 06:19 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1120 Đinh Văn Tuân

Đinh Văn Tuân

    Chưa sử dụng CAD

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

Đã gửi 24 March 2012 - 09:21 PM

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