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  
leem

[Nhờ chỉnh sửa] lisp chuyển layer.

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

leem    0

(DEFUN C:le01()
(sssetfirst nil (ssget "x" '((8 . "KT-TRUC"))))
(Setq chuyen (Ssget))
(command "chprop" chuyen "" "la" "KC-TRUC"  "")
(Princ))

(defun chla(a b /)
(sssetfirst nil (ssget "x" '((8 . a))))
(Setq chuyen (Ssget))
(command "chprop" chuyen "" "la" b "")
(Princ))
(DEFUN C:le02()  (CHLA "KT-TRUC" "KC-TRUC"))

 

Lệnh le01 dùng để chuyển tất cả các đối tượng thuộc layer: KT-TRUC sang KC-TRUC.

Tạo hàm con: chla với 2 biến ab, các anh chị sửa lại dùm em, vì sao le02 nó không hiểu a và b là 2 chuỗi vậy?

Chân thành cám ơ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
leem    0

Em đã sửa lại, nhưng vẫn chưa được bác ạ, acad báo: "; error: bad point argument", phiền các anh check lại dùm em tý nữ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
Doan Van Ha    2.676

Nãy mới để ý đến hàm cons mà quên hàm list. Nên sửa thế này

(defun chla(a b /)
(sssetfirst nil (ssget "x" (list (cons 8 a))))
(Setq chuyen (Ssget))
(command "chprop" chuyen "" "la" b "")
(Princ))
(DEFUN C:le02()  (CHLA "KT-TRUC" "KC-TRUC"))

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

'( là viết tắc của hàm LIST, nhưng những chỗ khác viết (id . obj) được mà, ví dụ:

(ssget "X" '((0 . "TEXT,MTEXT"))) thay vì phải viết: (ssget "X" (list (cons 0 "TEXT,MTEXT")))

Anh có thể làm ơn giải thích rõ chỗ này được không ạ! Đa 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
Doan Van Ha    2.676

Lỗi này dễ hiểu nhầm. Trích dẫn ví dụ:

(setq a 1 b 2 c 3)

(setq lst (list a b c)) => (1 2 3)

(setq lst '(a b c)) => (A B C)

Hàm (list a b c) sẽ lượng giá các biến a, b, c. Nhưng '(a b c) không lượng giá các biến => chỉ khi nào các giá trị trong () là tường minh bạn mới dùng được '(...).

Hy vọng bạn hiể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
leem    0

Xin cảm ơn anh Doan Van Ha!

 

Sẵn dịp cho em hỏi thêm vấn đề này xíu nữa: Visual LISP là một trình biên dịch, vì vậy, khi chạy một đoạn code thì chỉ chạy đến lúc "gặp lỗi" sẽ đột ngột dừng lại - như vậy, các giá trị biến hệ thống được thiết định trước khi chạy đoạn code đó bị thay đổi (tất nhiên là chúng ta sẽ khôi phục lại ở cuối đoạn code đó - tuy nhiên, đoạn này nằm sau điểm bị ngừng!).

Như vậy, em muốn hỏi anh làm thế nào để khi chạy bị lỗi ---> tự động khôi phục lại giá trị các biến hệ thống ban đầu đã được thiết định?

 

Chân thành cám ơn anh!

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
Doan Van Ha    2.676

Tham khảo đoạn code tôi thường dùng:

;----- Hµm nµy ®Æt ®Çu ch­¬ng tr×nh.
(defun BAT_DAU()
(setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)))
(vla-StartUndoMark AcDoc)
(mapcar '(lambda (key val) (set key (getvar val))) '(osm cmd dmz) '("osmode" "cmdecho" "dimzin"))    ;LÊy
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") '(0 0 0))   	     ;§Æt
(setq err *error* *error* KHI_LOI))
;----- Hµm nµy ®Æt cuèi ch­¬ng tr×nh.
(defun KET_THUC()
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") (list osm cmd dmz))        ;Tr¶
(vla-EndUndoMark AcDoc)
(setq *error* err))
;----- Hµm nµy xö lý khi cã lçi x·y ra (n»m trong hµm BAT_DAU).
(defun KHI_LOI(msg)
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") (list osm cmd dmz))        ;Tr¶
(vla-EndUndoMark AcDoc)
(princ (strcat "\n" msg ", Reset System Variables\n"))
(setq *error* err))

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

Bạn tìm hiểu về hàm *error* nhé, khi lisp lỗi nó sẽ thực hiện hàm này, việc của bạn là gán code đặt lại thiết đặt ở trong hàm *error* của bạn. Bạn hãy search lại lần nữa nhé, mình tin chắc trên diễn đàn đã có khá nhiều ví dụ rồ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
leem    0

Sẵn dịp, cho em leo thang hỏi thêm câu này nữa nhé! Khi load và chạy một autoLISP, vi dụ lệnh aaa, ACAD thông báo như sau:

 

 

Command: aaa

Unknown command "aaa". Press F1 for help.

Unknown command "aaa". Press F1 for help.

 

Tuy nhiên, mặc dù ACAD thông báo như vậy, nhưng lệnh aaa vẫn thực hiện được và đúng mục đích! Xin được hỏi các anh, như vậy là trong code của aaa bị thừa gì vậy? Có cách nào để kiểm tra và khắc phục?!

 

Xin chân thành cám ơ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

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  

×