Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
10 replies to this topic

#1 leem

leem

    biết pan

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

Đã gửi 16 January 2013 - 12:17 PM


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

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

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

b thì OK nhưng a thì NO.
Sửa (8 . a) thành (cons 8 a)
  • 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.


#3 leem

leem

    biết pan

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

Đã gửi 16 January 2013 - 01:41 PM

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

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 16 January 2013 - 01:56 PM

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

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


#5 leem

leem

    biết pan

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

Đã gửi 16 January 2013 - 04:05 PM

'( 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ạ!
  • 0

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 16 January 2013 - 04:50 PM

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


#7 leem

leem

    biết pan

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

Đã gửi 17 January 2013 - 08:05 AM

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

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 17 January 2013 - 11:42 PM

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

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


#9 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 January 2013 - 11:45 PM

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


#10 leem

leem

    biết pan

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

Đã gửi 19 January 2013 - 01:26 PM

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

#11 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 January 2013 - 02:16 PM

Thừa dấu "" trong dòng command
  • 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