Đến nội dung


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

Hướng dẫn lập trình Lisp


  • Please log in to reply
497 replies to this topic

#341 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 27 June 2011 - 02:46 PM

Truớc tiên để chọn các Block có tên 1a,1b,1c,1d và 1e trên bản vẽ, có thể viết như sau :
(setq ss (ssget '((0 . "INSERT")(2 . "1a,1b,1c,1d,1e"))) )

Sau đó là duyệt qua tập ss này:
- lấy tên (Block Name) của từng đối tuợng
- tùy theo d/kiện lọc mà đưa vào các tập tưong ứng. (sử dụng hàm ssadd)

tham khảo :

(defun c:test(/ origin ss_1b ss_1a1c)

(defun ssfilter (ss str / e i res)
(setq res (ssadd))
(setq i -1 )
(while (setq e (ssname ss (setq i (1+ i))))
(if (wcmatch (cdr (assoc 2 (entget e))) str)
(ssadd e res) ))
res)

(setq origin (ssget '((0 . "INSERT")(2 . "1a,1b,1c,1d,1e"))) )
(setq ss_1b (ssfilter origin "1b"))
(setq ss_1a1c (ssfilter origin "1a,1c"))
)

Hoặc ngắn gọn hơn 1 tẹo tẹo là :
(ssget '((0 . "INSERT")(2 . "1[abcde]")))
P/S bác GiaBach : hàm lọc nếu đưa 2 + điều kiện ra làm list đối số thì đẹp hơn bác nhỉ, có thể dùng cho việc tách theo các điều kiện khác.(srr nãy e type nhầm ^^)
Tuy nhiên câu này nên post bên Hỏi về Lisp thì đúng hơn, em đã xóa bài 1 lần vì vi phạm chủ đề, nhắc nhở bạn duchieu0205 lần nữa nhé ^^
  • 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


#342 duchieu0205

duchieu0205

    biết vẽ line

  • Members
  • PipPip
  • 20 Bài viết
Điểm đánh giá: -3 (bình thường)

Đã gửi 27 June 2011 - 03:13 PM

Cám ơn anh GiabBach! Thật là đi một ngày đàng học một sàng khôn.
  • -2

#343 hugo75

hugo75

    biết vẽ polygon

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

Đã gửi 29 June 2011 - 09:21 PM

Nhờ các bác sửa và giải thích giùm e đoạn này:
(command 	".pline" p1 "W" 0 0 (setq p (polar p1 (/ pi 2) h1)) (setq p (list (+ (car p) l3) (+ (cadr p) h2))) (setq p (polar p (/ pi 2) h3)) ""
Thắc mắc e gửi file đính kèm.Mong các bác chỉ giúp.Thanks.
http://www.cadviet.c...drawing1_68.dwg
  • 0

#344 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 June 2011 - 10:05 PM

Nhờ các bác sửa và giải thích giùm e đoạn này:

(command 	".pline" p1 "W" 0 0 (setq p (polar p1 (/ pi 2) h1)) (setq p (list (+ (car p) l3) (+ (cadr p) h2))) (setq p (polar p (/ pi 2) h3)) ""
Thắc mắc e gửi file đính kèm.Mong các bác chỉ giúp.Thanks.
http://www.cadviet.c...drawing1_68.dwg

Hề hề hề,
1/- Đoạn code bạn pót còn thiếu cái dấu ngoặc để đóng hàm command lại. Phải thế ni mới đúng:
(command ".pline" p1 "W" 0 0 (setq p (polar p1 (/ pi 2) h1)) (setq p (list (+ (car p) l3) (+ (cadr p) h2))) (setq p (polar p (/ pi 2) h3)) "")
2/- Đoạn code trên dùng để vẽ một đoạn polyline. Cụ thể như sau:
( : để bắt đầu một hàm lisp
command : là tên hàm lisp dùng để gọi một lệnh trong CAD
".pline" : là tên lệnh trong CAD
p1: là biến ứng với một điểm đã xác định trước dùng để bắt đầu vẽ polyline từ điểm đó.
"W": Là tham số của lệnh vẽ pline chỉ độ rộng của đường polyline
0: Chỉ độ rộng tại điểm bắt đầu của polyline được vẽ
0: Chỉ độ rộng khi kết thúc của polyline
(setq p (polar p1 (/ pi 2) h1)): là hàm xác định điểm kế tiếp p của polyline. P được lấy theo tọa độ tương đối độc cực so với p1, có độ dài là h1 và theo hướng pi/2 so với trục x.
(setq p (list (+ (car p) l3) (+ (cadr p) h2))): là hàm xác định điểm kế tiếp p của polyline. P mới được lấy theo tọa độ tuyệt đối với tọa độ x mới lớn hơn tọa độ x cũ là l3 và tọa độ y mới lớn hơn tọa độ y cũ là h2
(setq p (polar p (/ pi 2) h3)) : là hàm xác định điểm kế tiếp p của polyline. P mới này được lấy theo tọa độ tương đối độc cực so với p cũ , bạn hãy tự hiểu nốt nhé
"" : là ký tự để lisp hiểu rằng nhấn Enter trên bàn phím khi thực hiện hàm lệnh command
): để đóng hàm lệnh command lại.
3/- Từ đây bạn có thể tự bổ sung thêm một điểm p nữa vào hàm để có thể vẽ được cái polyline như bạn muốn. Hãy thử làm xem sao, chớ ngồi chờ sung chín e hơi lâu đó. Nếu bạn làm không được thì hãy post cái bạn đã làm lên để được hướng dẫn tiếp nhé.
Hề hề hề,...
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#345 790312

790312

    biết lệnh fillet

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

Đã gửi 27 July 2011 - 08:40 PM

Mình dùng đoạn lisp sau:
.....
(setq btbv 30)
(setq BV (* (getreal (strcat "Chieu day lop bao ve < " (itoa btbv) " >: ")) 5))
(if (null BV) (setq BV btbv))
......
Để mặc định lớp bảo vệ là 30 enter luôn khỏi nhập nhưng nó lại báo lỗi:; error: bad argument type: numberp: nil.Còn nếu nhập số từ bàn phím thì nó thực hiện lệnh bình thường.Mong các bác chỉ giúp.Thanks.
  • 0

#346 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 27 July 2011 - 10:09 PM

Mình dùng đoạn lisp sau:
.....
(setq btbv 30)
(setq BV (* (getreal (strcat "Chieu day lop bao ve < " (itoa btbv) " >: ")) 5))
(if (null BV) (setq BV btbv))
......

Để mặc định lớp bảo vệ là 30 enter luôn khỏi nhập nhưng nó lại báo lỗi:; error: bad argument type: numberp: nil.Còn nếu nhập số từ bàn phím thì nó thực hiện lệnh bình thường.Mong các bác chỉ giúp.Thanks.

Lỗi là đúng rồi, bởi lẽ khi bạn enter thì (getreal (strcat "Chieu day lop bao ve < " (itoa btbv) " >: ")) trả về Nil nên (* nil 5) báo lỗi.
Muốn enter đúng thì bạn phải viết, chẳng hạn như thế này:
.....
(setq btbv 30)
(setq BV (getreal (strcat "Chieu day lop bao ve < " (itoa btbv) " >: ")))
(setq BV (if (null BV) btbv (* 5 BV)))
......

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


#347 790312

790312

    biết lệnh fillet

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

Đã gửi 27 July 2011 - 10:18 PM

Lỗi là đúng rồi, bởi lẽ khi bạn enter thì (getreal (strcat "Chieu day lop bao ve < " (itoa btbv) " >: ")) trả về Nil nên (* nil 5) báo lỗi.
Muốn enter đúng thì bạn phải viết:
.....
(setq btbv 30)
(setq BV (getreal (strcat "Chieu day lop bao ve < " (itoa btbv) " >: ")))
(setq BV (if (null BV) btbv (* 5 BV)))
......

Mình muốn đặt BV bằng 30*5=150,sửa theo bạn thì nó hiểu BV=30 thôi.Bạn xem sửa giúp.
  • 0

#348 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 27 July 2011 - 10:25 PM

Mình muốn đặt BV bằng 30*5=150,sửa theo bạn thì nó hiểu BV=30 thôi.Bạn xem sửa giúp.

Định hỏi bạn vì bạn đang thiếu 1 ý, nhưng bạn đã nói rồi thì sửa như thế này:
Thay: (setq BV (if (null BV) btbv (* 5 BV)))
Bởi: (setq BV (if (null BV) (* 5 btbv) (* 5 BV)))
  • 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.


#349 hoanguct

hoanguct

    biết vẽ line

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

Đã gửi 27 July 2011 - 11:58 PM

Tự tay mình lập một chương trình Lisp có gì khác so với nhờ ai đó làm? Chưa cần xét kết quả, điểm khác nhau rất cơ bản là bạn sẽ có được cái cảm giác rất là khoái chí (không thể diễn tả) khi chạy thử chương trình.
Ssg lập topic này không ngoài mục đích tạo điều kiện cho các bạn tự mình tìm hiểu và khám phá cái cảm giác "khoái chí không thể diễn tả" nói trên.
Với tinh thần "Share is Receive", ssg cũng mong các bạn đã thành thạo Lisp quan tâm giúp đỡ các bạn mới để cộng đồng Lisp của CadViet ngày càng đông vui và tạo được nhiều chương trình hữu ích.
Để bắt đầu, ssg post lại một bài viết cũ, nhưng có lẽ vẫn còn mới đối với một số bạn. Hy vọng sẽ giúp được chút gì đó cho các bạn mới tiếp cận với Lisp:

http://www.cadviet.c...les/Relax_1.zip

Download, giải nén rồi đọc file *.doc

thanks bác
  • 0

#350 790312

790312

    biết lệnh fillet

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

Đã gửi 30 July 2011 - 10:29 PM

Đoạn code sau:
(COMMAND "PLINE" PTD ptc pt1 "")
(command "fillet" "r" "75")
(command "fillet" "p" "l")
Theo e hiểu sẽ vẽ 1 polyline từ điểm PTD đến ptc đến pt1.Dòng thứ 2 sẽ bo plyline này 1 góc có bán kính 75 còn dòng thứ 3 để làm gì?Mong các bác giải thích hộ.
  • 0

#351 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 31 July 2011 - 10:20 AM

Đoạn code sau:
(COMMAND "PLINE" PTD ptc pt1 "")
(command "fillet" "r" "75")
(command "fillet" "p" "l")
Theo e hiểu sẽ vẽ 1 polyline từ điểm PTD đến ptc đến pt1.Dòng thứ 2 sẽ bo plyline này 1 góc có bán kính 75 còn dòng thứ 3 để làm gì?Mong các bác giải thích hộ.

(command "fillet" "p" "l") tức là:
1). "p" : đối tượng để fillet là "polyline".
2). "l" : là "last", tức là đối tượng sau cùng.
==> dòng 1 để vẽ, dòng 2 để lấy bán kính bo, dòng 3 để chọn đối tượng bo là polyline sau cùng. Bạn có thể thay dòng trên bằng dòng dưới đây cũng được:
(command "fillet" "p" "last")
  • 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.


#352 790312

790312

    biết lệnh fillet

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

Đã gửi 03 August 2011 - 04:04 PM

Nhờ các bác giải thích giùm e mấy dòng sau:
(defun myerror (s) ; If an error (such as CTRL-C) occurs
; while this command is active...
(cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
)
(setvar "cmdecho" CMD) ; Restore saved modes
(setvar "osmode" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(princ)
)

Chân thành cảm ơn.
  • 0

#353 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 August 2011 - 04:11 PM

Nhờ các bác giải thích giùm e mấy dòng sau:
(defun myerror (s) ; If an error (such as CTRL-C) occurs
; while this command is active...
(cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
)
(setvar "cmdecho" CMD) ; Restore saved modes
(setvar "osmode" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(princ)
)

Chân thành cảm ơn.

Bạn chép còn thiếu mấy dòng liên quan tới đoạn code này (nó thường nằm đầu chương trình). Tuy nhiên có thể giải thích tổng quát như thế này:
Khi có lỗi xãy ra sẽ có dòng thông báo lỗi xuất hiện, đồng thời các biến hệ thống trả lại giá trị ban đầu.
Nói thêm: ở mục #352 tôi có trả lời cho bạn câu hỏi mà bạn đã hỏi mấy ngày trước rồ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.


#354 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 August 2011 - 04:31 PM

Đây là hàm Error Trap nhằm bắt lỗi khi quá trình thực hiện của lisp bị gián đoạn, gặp lỗi bất thường.... => hàm thường sẽ có chức năng thông báo lỗi, hoặc trả lại các thiết đặt đã bị thay đổi.Khi hàm *error* của CAD khác nil, nếu trong quá trình chạy lisp gặp lỗi, nó sẽ trả về thông báo về lỗi đó
Nôm na quá trình sẽ như sau :
- Gán hàm (*error*) nguyên thủy vào 1 biến lưu trữ : (setq OLDERR *error*) (để sau này lấy lại)
- Định nghĩa lại hàm (*error*) thành hàm (myerror) của bạn. (Setq *error* myerror)
OK, bây giờ khi thao tác lisp gặp lỗi, nó sẽ thực thi hàm *error* (mà thực chất bạn đã định nghĩa lại là hàm myerror => thực thi hàm
- Các nội dung thực hiện trong hàm myerror của bạn :

(defun myerror (s) ;s là thông báo CAD trả về
(cond ;Hàm điều kiện rẽ nhánh, bạn đọc trong Help nhé
((= s "quit / exit abort") (princ)) ;nếu thông báo là quit / exit abort thì thoát lặng lẽ (princ)
((/= s "Function cancelled") (princ (strcat "\nError: " s))) ; nếu thông báo là Function cancelled thì hiện dòng thông báo lỗi (princ (strcat "\nError: " s))
)
(setvar "cmdecho" CMD) ; Trả lại biến hệ thống cmdecho về giá trị CMD, thường giá trị CMD được lấy ở đầu lisp, tức từ khi chưa thao tác gì với hệ thống : (setq CMD (getvar "cmdecho"), để khi gặp lỗi thì trả lại như cũ
(setvar "osmode" OSM) ; Trả lại biến osmode tương tự như trên
(setq *error* OLDERR) ; Lấy lại định nghĩa hàm *error* mà bạn đã lưu trong biến OLDERR ở đầu lisp, lúc này hàm *error* trở về ban đầu trước khi chạy lisp, không còn là hàm (myerror) của bạn nữa
(princ)
)


  • 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


#355 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 August 2011 - 05:01 PM

Đây là hàm Error Trap nhằm bắt lỗi khi quá trình thực hiện của lisp bị gián đoạn, gặp lỗi bất thường.... => hàm thường sẽ có chức năng thông báo lỗi, hoặc trả lại các thiết đặt đã bị thay đổi.Khi hàm *error* của CAD khác nil, nếu trong quá trình chạy lisp gặp lỗi, nó sẽ trả về thông báo về lỗi đó
Nôm na quá trình sẽ như sau :
- Gán hàm (*error*) nguyên thủy vào 1 biến lưu trữ : (setq OLDERR *error*) (để sau này lấy lại)
- Định nghĩa lại hàm (*error*) thành hàm (myerror) của bạn. (Setq *error* myerror)
OK, bây giờ khi thao tác lisp gặp lỗi, nó sẽ thực thi hàm *error* (mà thực chất bạn đã định nghĩa lại là hàm myerror => thực thi hàm
- Các nội dung thực hiện trong hàm myerror của bạn :

Sẵn đây hỏi bạn cái này luôn: nếu c.trình lsp đang chạy mà user bấm esc thì có cách gì để bản vẽ trả lại mọi thứ như trước khi chưa chạy lsp (trả biến hệ thống thì được, nhưng trả các lệnh thì tôi bó tay, VD lsp mới vẽ 2 line thì bấm esc, làm sao để 2 line này cũng... biến mất).
  • 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.


#356 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 03 August 2011 - 05:08 PM

Sẵn đây hỏi bạn cái này luôn: nếu c.trình lsp đang chạy mà user bấm esc thì có cách gì để bản vẽ trả lại mọi thứ như trước khi chưa chạy lsp (trả biến hệ thống thì được, nhưng trả các lệnh thì tôi bó tay, VD lsp mới vẽ 2 line thì bấm esc, làm sao để 2 line này cũng... biến mất).

Cái này Bạn chỉ cần đặt thời điểm bắt lỗi bằng (command "undo" "be") thời điểm kết thúc là (command "undo" "e") rồi cho vao hàm bẫy lỗi là được.
Bạn tham khảo bài #4 ở đây:http://www.cadviet.c...threaded&start=
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#357 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 August 2011 - 05:15 PM

Cái này Bạn chỉ cần đặt thời điểm bắt lỗi bằng (command "undo" "be") thời điểm kết thúc là (command "undo" "e") rồi cho vao hàm bẫy lỗi là được.
Bạn tham khảo bài #4 ở đây:http://www.cadviet.c...threaded&start=

"be" ở đầu lsp và "e" ở cuối lsp thì khi lỗi user phải "u" một cái mới được. Ý tôi là c.trình tự "u" luô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.


#358 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 August 2011 - 05:28 PM

Bác cho cái "u" vào hàm bẫy lỗi luôn xem có được không ^^
  • 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


#359 790312

790312

    biết lệnh fillet

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

Đã gửi 03 August 2011 - 05:47 PM

(defun myerror (s) ; If an error (such as CTRL-C) occurs
; while this command is active...
(cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
)
(setvar "cmdecho" CMD) ; Restore saved modes
(setvar "osmode" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(princ)
)

Còn đây là đoạn sau của nó:
(DEFUN C:ZZ (/ CMD SS LTH DEM PT DS KDL N70 GOCX GOCY PT13 PT14 PTI PT13I PT14I
PT13N PT14N O13 O14 N13 N14 OSM OLDERR PT10 PT11)
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETQ OLDERR *error*
*error* myerror)
(PRINC "Please select dimension object!")
(SETQ SS (SSGET))
(SETVAR "CMDECHO" 0)
(SETQ PT (GETPOINT "Point to trim or extend:"))
(SETQ PT (TRANS PT 1 0))
(COMMAND "UCS" "W")
(SETQ LTH (SSLENGTH SS))
(SETQ DEM 0)
(WHILE (< DEM LTH)
(PROGN
(SETQ DS (ENTGET (SSNAME SS DEM)))
(SETQ KDL (CDR (ASSOC 0 DS)))
(IF (= "DIMENSION" KDL)
(PROGN
(SETQ PT10 (CDR (ASSOC 10 DS)))
(SETQ PT11 (CDR (ASSOC 11 DS)))
(SETQ PT13 (CDR (ASSOC 13 DS)))
(SETQ PT14 (CDR (ASSOC 14 DS)))
(SETQ N70 (CDR (ASSOC 70 DS)))
(IF (OR (= N70 0) (= N70 32) (= N70 33) (= N70 160) (= N70 161))
(PROGN
(SETQ GOCY (ANGLE PT10 PT14))
(SETQ GOCX (+ GOCY (/ PI 2)))
)
)
(SETVAR "OSMODE" 0)
(SETQ PTI (POLAR PT GOCX 2))
(SETQ PT13I (POLAR PT13 GOCY 2))
(SETQ PT14I (POLAR PT14 GOCY 2))
(SETQ PT13N (INTERS PT PTI PT13 PT13I NIL))
(SETQ PT14N (INTERS PT PTI PT14 PT14I NIL))
(SETQ O13 (ASSOC 13 DS))
(SETQ O14 (ASSOC 14 DS))
(SETQ N13 (CONS 13 PT13N))
(SETQ N14 (CONS 14 PT14N))
(SETQ DS (SUBST N13 O13 DS))
(SETQ DS (SUBST N14 O14 DS))
(ENTMOD DS)
)
)
(SETQ DEM (+ DEM 1))
)
)
(COMMAND "UCS" "P")
(SETVAR "CMDECHO" CMD)
(SETVAR "OSMODE" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(PRINC)
)
Nếu không có đoạn đầu thì khi có lỗi nó sẽ làm sao vậy các bác?Thanks.
  • 0

#360 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 August 2011 - 06:16 PM

Khi có lỗi thì lisp không hoàn tất công việc, nếu lỗi trước đoạn

(SETVAR "CMDECHO" CMD)
(SETVAR "OSMODE" OSM)

thì 2 giá trị này không được reset. Bạn không đọc bài trên mọi người viết rồ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