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

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

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

Thành thật cảm ơn bác,e đã sửa theo như bác nói nhưng sau khi nhập bề dày lớp bảo vệ thì nó không tiếp tục lệnh.Mong bác dành chút thời gian sửa hoàn chỉnh giùm e.Mong tin bác.

(initget 1 "D B")
 	(setq res (getkword "\n<M.BANG/M.DON><B/D>:"))
(setq  	p1 (getpoint "\nDiem chen:")
	l1 (getreal "\nBe rong mong:")
	l2 (getreal "\nBe rong co mong:")
	l3 (/ (- l1 l2) 2)
	h1 (getreal "\nChieu cao ben mong:")
	h2 (getreal "\nChieu cao phan nghieng:")
	h3 (getreal "\nChieu cao co mong:")
	bv (getreal "\nBe day lop bao ve:"))
               (setq dkt 25))
       (initget 6)
       (setq d (getreal (strcat "\nduong kinh thep (mm) <" (itoa dkt) ">: ")))
       (if (null d) (setq d dkt))
      (setq n (getint "\nS.luong thep day mong:")
)

  • Vote giảm 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

Thành thật cảm ơn bác,e đã sửa theo như bác nói nhưng sau khi nhập bề dày lớp bảo vệ thì nó không tiếp tục lệnh.Mong bác dành chút thời gian sửa hoàn chỉnh giùm e.Mong tin bác.

(initget 1 "D B")
 	(setq res (getkword "\n<M.BANG/M.DON><B/D>:"))
(setq  	p1 (getpoint "\nDiem chen:")
	l1 (getreal "\nBe rong mong:")
	l2 (getreal "\nBe rong co mong:")
	l3 (/ (- l1 l2) 2)
	h1 (getreal "\nChieu cao ben mong:")
	h2 (getreal "\nChieu cao phan nghieng:")
	h3 (getreal "\nChieu cao co mong:")
	bv (getreal "\nBe day lop bao ve:"))
               (setq dkt 25))
       (initget 6)
       (setq d (getreal (strcat "\nduong kinh thep (mm) <" (itoa dkt) ">: ")))
       (if (null d) (setq d dkt))
      (setq n (getint "\nS.luong thep day mong:")
)

Thôi thì mình sửa một lần cho bạn tham khảo vậy.

(initget 1 "D B")
 	(setq res (getkword "\n<M.BANG/M.DON><B/D>:"))
(setq  	p1 (getpoint "\nDiem chen:")
	l1 (getreal "\nBe rong mong:")
	l2 (getreal "\nBe rong co mong:")
	l3 (/ (- l1 l2) 2)
	h1 (getreal "\nChieu cao ben mong:")
	h2 (getreal "\nChieu cao phan nghieng:")
	h3 (getreal "\nChieu cao co mong:")
	bv (getreal "\nBe day lop bao ve:")
	dkt 25
	)
       (initget 6)
       (setq d (getreal (strcat "\nduong kinh thep (mm) <" (itoa dkt) ">: ")))
       (if (null d) (setq d dkt))
      (setq n (getint "\nS.luong thep day mong:"))

  • 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

Em có việc này nhờ các anh chị trên diễn đàn giúp đỡ. Em dùn hàm ssget để chọn các block có tên cho trước trong bản vẽ:

 

(setq nhomdau (ssget

'((-4 . "<OR")

(-4 . "<AND")(0 . "INSERT")(2 . "1a")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1b")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1c")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1d")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1e")(-4 . "AND>")

(-4 . "OR>"))

)

)

Vấn đề ở chỗ em muốn tách "nhomdau" thành các nhóm nhỏ để xử lý ví dụ như:

Các block có tên "1a" vào "nhom1"

Các block có tên "1b" vào "nhom2"

Các block có tên "1c"; "1e" ; "1d" vào "nhom3"

Mong các anh chị dành thời gian giúp đỡ cho em! Em xin được cám ơn trước mọi ngườ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

Em có việc này nhờ các anh chị trên diễn đàn giúp đỡ. Em dùn hàm ssget để chọn các block có tên cho trước trong bản vẽ:

 

(setq nhomdau (ssget

'((-4 . "<OR")

(-4 . "<AND")(0 . "INSERT")(2 . "1a")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1b")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1c")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1d")(-4 . "AND>")

(-4 . "<AND")(0 . "INSERT")(2 . "1e")(-4 . "AND>")

(-4 . "OR>"))

)

)

Vấn đề ở chỗ em muốn tách "nhomdau" thành các nhóm nhỏ để xử lý ví dụ như:

Các block có tên "1a" vào "nhom1"

Các block có tên "1b" vào "nhom2"

Các block có tên "1c"; "1e" ; "1d" vào "nhom3"

Mong các anh chị dành thời gian giúp đỡ cho em! Em xin được cám ơn trước mọi người

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

  • 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

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é ^^

  • 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

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.com/upfiles/3/drawing1_68.dwg

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

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.com/upfiles/3/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ề,...

  • 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

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.

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

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

......

  • 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

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.

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

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

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ự 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.com/upfiles/Relax_1.zip

 

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

thanks bác

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

Đ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ộ.

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

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

  • 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

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.

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

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

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

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

)

  • 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

Đâ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).

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

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.com/forum/index.php?showtopic=6760&pid=41255&mode=threaded&start=

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á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.com/forum/index.php?showtopic=6760&pid=41255&mode=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.

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

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

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

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!

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

×