Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
* * * - - 3 Bình chọn

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


  • Please log in to reply
493 replies to this topic

#341 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5511 Bài viết
Điểm đánh giá: 2655 (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.


#342 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

#343 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5511 Bài viết
Điểm đánh giá: 2655 (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.


#344 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5699 Bài viết
Điểm đánh giá: 2623 (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


#345 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5511 Bài viết
Điểm đánh giá: 2655 (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.


#346 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 708 (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!

#347 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5511 Bài viết
Điểm đánh giá: 2655 (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.


#348 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5699 Bài viết
Điểm đánh giá: 2623 (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


#349 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

#350 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5699 Bài viết
Điểm đánh giá: 2623 (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


#351 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 August 2011 - 10:29 PM

Bác cho cái "u" vào hàm bẫy lỗi luôn xem có được không ^^

Cái "u" này cho vào hàm bẫy lỗi thì nó:
1). Giải quyết được vấn đề: khi chương trình tự gây lỗi nó sẽ OK.
2). Không giải quyết được vấn đề: khi user bấm esc nó chẳng chịu OK.
Mà tại sao biến hệ thống thì U được còn các lệnh thì không U được nhỉ???
  • 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.


#352 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 August 2011 - 10:42 PM

Bác ngó qua cái ví dụ này xem sao :
(defun c:test ()
(setvar "cmdecho" 0)
(command "undo" "Begin")

(defun testerr (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(command "undo" "End")

(command "U")
(command "U")
(command "ucs" "")
(setq *error* olderr)
(princ " \n..........Tro ve nhu truoc ne....
")
(princ)
)

(setq olderr *error*
*error* testerr)



(command "circle" '(5.0 6.0) 4.0)
(command "polygon" "" '(6.0 4.0) "" 2.0)
(command "circle" '(6.0 4.0) 5.0)
(command "extrude" "L" "" 6.0 "")
(setq cx (entlast))
(command "slice" cx "" '(6.0 4.0 0.0) '(6.0 6.0 0.0) '(6.0 4.0 1.0) '(4.0
4.0 0.0))
;; (rotate3d cx "" '(6.0 4.0 0.0) '(6.0 5.0 0.0) 15)
(command "move" cx "" '(6.0 4.0) '(9.0 4.0))
(command "vpoint" "-1,-1,1")
(command "ucs" "v")
(command "circle" '(1.0 2.0) 3.0)
(command "circle" '(3.0 3.0) 2.0)
(princ "\n .....Bac an Esc xem no nhu the nao :")
(command "circle" pause pause)
(command "ucs" "")
(command "plan" "")
(command "undo" "End")
)

  • 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


#353 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

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

Bác ngó qua cái ví dụ này xem sao :

(defun c:test ()
(setvar "cmdecho" 0)
(command "undo" "Begin")

(defun testerr (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(command "undo" "End")

(command "U")
(command "U")
(command "ucs" "")
(setq *error* olderr)
(princ " \n..........Tro ve nhu truoc ne....
")
(princ)
)

(setq olderr *error*
*error* testerr)



(command "circle" '(5.0 6.0) 4.0)
(command "polygon" "" '(6.0 4.0) "" 2.0)
(command "circle" '(6.0 4.0) 5.0)
(command "extrude" "L" "" 6.0 "")
(setq cx (entlast))
(command "slice" cx "" '(6.0 4.0 0.0) '(6.0 6.0 0.0) '(6.0 4.0 1.0) '(4.0
4.0 0.0))
;; (rotate3d cx "" '(6.0 4.0 0.0) '(6.0 5.0 0.0) 15)
(command "move" cx "" '(6.0 4.0) '(9.0 4.0))
(command "vpoint" "-1,-1,1")
(command "ucs" "v")
(command "circle" '(1.0 2.0) 3.0)
(command "circle" '(3.0 3.0) 2.0)
(princ "\n .....Bac an Esc xem no nhu the nao :")
(command "circle" pause pause)
(command "ucs" "")
(command "plan" "")
(command "undo" "End")
)

Ketxu thử nhấn esc thật nhanh trước khi "Bac an Esc xem no nhu the nao" xem nó như thế nào. Chưa được Ket ơi!
Thân thương!
  • 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
  • 5699 Bài viết
Điểm đánh giá: 2623 (tuyệt vời)

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

Hệch hệch, cái này ket nghiên cứu, chỉ lấy ví dụ thôi. Bác thử định nghĩa lại luôn *error*, không cần reset nữa, rồi để hàm đó load bên ngoài xem sao..Bác ấn nhanh quá có khi cái hàm testerr chẳng kịp được load, hoặc chẳn kịp được gán cũng nên. Với lại Undo nó cũng khó hiểu lắm ^^
  • 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


#355 tigervacat

tigervacat

    biết pan

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

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

a ssg ơi cho em hỏiem mới tâp tành vào nghề XD trình độ cad của em còn yếu,nên em muốn hỏi anh em nên bắt đầu lisp từ đâu và học lisp có được ko xin bác chỉ giáo cho em nhé,em cám ơn nhiều.nếu bác nào biết chỉ cho em nha,em cám ơn mọi người
  • 0

#356 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 August 2011 - 04:21 PM

a ssg ơi cho em hỏiem mới tâp tành vào nghề XD trình độ cad của em còn yếu,nên em muốn hỏi anh em nên bắt đầu lisp từ đâu và học lisp có được ko xin bác chỉ giáo cho em nhé,em cám ơn nhiều.nếu bác nào biết chỉ cho em nha,em cám ơn mọi người

Hề hề hề,
Muốn học lisp thời nên bắt đầu học từ ..... CAD, và học thời chắc chắn là được, lâu mau ấy là còn tùy vào tinh thần và thái độ học tập của bạn.
Bạn cố gắng hiểu kỹ các thủ thuật trong CAD, đọc thêm các ví dụ về lisp được ứng dụng vào CAD để từ đó hiểu ra cách tạo ra một lisp. Thế rồi lọ mọ làm lisper vài cái linh tinh cho nó sướng cái bụng, và cứ thế , cứ thế. sẽ thành công.
Hề hề hề,.
Các tài liệu về lisp thì có khá nhiều, ngay diễn đàn này cũng có kha khá đấy. Bạn thử search xem nhé. Cứ gỏ từ khóa AUTOLISP rồi enter sẽ ra một đống, tùy bạn chọn.
Hề hề hề,....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#357 quan08

quan08

    biết vẽ pline

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

Đã gửi 14 August 2011 - 01:53 PM

Các bác giúp e tí,e có 1 đoạn lisp như sau:
(setq btbvc 30)
(setq BV (getreal (strcat "Chieu day lop bao ve < " (itoa btbvc) " >: ")))

Đoạn này thì tự nó hiện lên con số 30 theo ý của e,chỉ enter là đưọc.Nhưng nếu e đổi lại như dưới đây:
(setq btbvc 30)
(setq BV (* (getreal (strcat "Chieu day lop bao ve < " (itoa btbvc) " >: ")) 5))

Nó vẫn hiện 30 nhưng enter luôn thì nó báo lỗi.Phải nhập số vào thì nó mới hiểu.Mong các bác xem giúp giùm.Thanks.
  • 0

#358 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 14 August 2011 - 02:38 PM

Không đoạn nào của bạn đúng ý đồ cả. Lisp thực hiện từ trong ra ngoài. Vậy hãy xem thứ tự những gì xảy ra :

(setq btbvc 30) ; Gán btbvc = 30
(itoa btbvc) ; Lấy String của btbvc : "30"
(strcat "Chieu day lop bao ve < " (itoa btbvc) " >: ") ; Nối chuỗi "Chieu day lop bao ve < " + "30" + " >: " thành
"Chieu day lop bao ve < 30 >: "
(getreal (strcat "Chieu day lop bao ve < " (itoa btbvc) " >: ")) ;Lấy giá trị Real với dòng nhắc "Chieu day lop bao ve < 30 >: "
Ở bước này, nếu bạn Enter luôn, ta sẽ được Nil
Và đến bước tiếp theo :
(* (getreal (strcat "Chieu day lop bao ve < " (itoa btbvc) " >: "))5)
;Máy sẽ thực hiện phép tính (* nil 5) => Lỗi, nil không phải là số nên không nhân được

Để thực hiện đúng, bạn cần tách nó ra thêm bước kiểm tra giá trị nhập vào là Nil hay không 1 cách dễ hiểu như sau :

(setq btbvc 30)
(If (setq BV (getreal (strcat "Chieu day lop bao ve < " (itoa btbvc) " >: "))) ;Kiểm tra BV = Nil hay không
(setq BV (* BV 5)) ; Nếu Không, nhân nó với 5
(setq BV (* btbvc 5)) ; Nếu BV = Nil, đặt lại giá trị cho nó bằng btbvc * 5 (hoặc gì đó tùy bạn)
)

Hoặc :

(setq BV (* 5 (cond ((getreal (strcat "Chieu day lop bao ve < " (itoa btbvc) " >: "))) (btbvc))))


  • 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


#359 caibutchi

caibutchi

    biết pan

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

Đã gửi 15 August 2011 - 10:17 AM

cho em hỏi bác tí.e mói tập autolisp.Em có 1 đường thẳng qua p1 p2.em muốn dùng hàm ssget để chọn đường thẳng này sau đó offset nó về phía bên phải với khoảng cách là 100 thì viết như thế nào ạ.
-Câu hỏi thứ 2 là tại sao em dùng hàm array thì nó cho chọn đối tượng là last(tức đối tượng vừa tạo ra)còn hàm offset lại không cho chọn đối tượng last ạ
(command ".line" p9 p10 "" )
(command "offset" 100 "last" p2 ""),
Nếu bây giờ e dùng hàm array thay hàm offset thì e muốn array các đối tượng này theo góc pi/2 thì điền thông số này vào đâu trong hàm ạ
(command ".line" p9 p10 "" )
(command ".array" "last" ???? "")
Cảm ơn mấy bác.Mong mấy bác giúp đỡ
  • 0

#360 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 15 August 2011 - 10:48 AM

Chào bạn ^^
Đi qua 2 điểm mà lại là 2 đường thẳng cơ à bạn :)
- SSget để chọn nhiều Line : (ssget (list (cons 0 "LINE")))
- Chọn 1 Line 2 đầu đã biết : (ssget p1 p2)
- CHọn 1 đối tượng : (car (entsel) )
- Bên phải của bạn CAD không xác định được
- Thay vì dùng "last" bạn hãy dùng (entlast)
- Với các hàm dùng (command...) bạn hãy thao tác lệnh như ý bạn muốn, rồi bật F2 để xem các bước nhập của nó, rồi ghi lại vào hàm
Chúc bạn thành công
  • 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