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

Học AutoLisp

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

Phần 1: bắt đầu

 

Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

 

Hãy tạo một file mới và save nó với tên hoclisp.lsp.

(princ "\nChao cadviet")

(princ)

Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

 

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

 

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").

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

bác hoành ơi e muốn tạo lisp là lưu và thoát bản vẽ như nào ạ

ví dụ là

e muon in xong bản vẽ thì tự động lưu và thoát bản vẽ luôn ý

In thì phải tự thực hiện thôi bạn, có chăng nên tách yêu cầu ra.

Ví dụ muốn lưu và thoát thì có thể dùng

(defun c:QQ2()

(command "CLOSE" "yes")

)

mình nghĩ như thế hay hơn

P.s có nhầm lẫn đừng vội dùng nhé, để mình xem lạ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

Xin chào a Hoành, tôi có sử dụng 1 số ct AutoLisp cho công việc của mình (nhưng không rành lập trình AutoLisp), trong quá trình sử dụng tính diện tích trên bản vẽ cad có 1 số vấn đề cần a góp ý điều chỉnh dùm

Tôi có đính kèm 2 file AutoLisp gồm:

1. Tính diện tích liên tục dùng lệnh tdt

2. Tính diện tích dùng lệnh ss

Tôi thích dùng file lisp1 để tính dtich rất nhanh, nhưng tôi thấy file lisp2 có 1 chức năng rất hay mà tôi rất muốn nhờ anh điều chỉnh file lisp1 dùm, đó là trước khi ghi ra số dtich của 1 hình thì sẽ hatch vào hình đó trước rồi mới ghi ra số(vì muốn nhìn thấy được hình dáng vị trí của hình mà minh vừa chọn, tính năng có trong file lisp2).

http://www.cadviet.com/upfiles/5/149234_tinh_dtich_ltuc__tdt_.lsp

http://www.cadviet.com/upfiles/5/149234_tinh_dtich__ss_.lsp

Rất mong nhận được sự giúp đỡ của anh,

Cám ơn anh rất nhiều.

  • 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

Mình thử viết một lisp dựng hệ lưới trục cho bản vẽ như sau, nhưng khi thực hiện thì bị lỗi “bad argument type: number: nil” và không vẽ ra được hệ trục, chỉ vẽ được các đường song song trục Ox, mong mọi người xem và chỉ giùm mình với:
 
 

(defun noiX(/ a b i j slx n)
  (setq slx (getreal "\n Nhap so luoi truc X:") i 1)
  (setq a (list 0) k 0 x 0)
  (while (<= i (- slx 1))
         (setq j (getreal "\n Nhap khoang cach:"))
         (setq n (+ x j))
         (setq x n)                ;;tinh tong khoang cach cac truc
         (setq b (cons (+ j 0) a)) ;;ghep khoang cach vao thanh 1 list
(setq a 
         (setq i (1+ i))
);;ket thuc while
  (setq xn (cdr (reverse a)))      ;;dao nguoc list va loai bo phan tu dau
  (princ)
  (princ xn)
  (princ x)
 
  )
;;------------------------------------------------------
(defun noiY(/ i sly a b j n)
  (setq sly (getreal "\n Nhap so luoi truc Y:") i 1)
  (setq a (list 0) k 0 y 0)
  (while (<= i (- sly 1))
         (setq j (getreal "\n Nhap khoang cach:"))
         (setq n (+ y j))
         (setq y n)
         (setq b (cons (+ j 0) a))
(setq a 
         (setq i (1+ i))
  )
  (setq yn (cdr (reverse a)))
  (princ)
  (princ yn)
  (princ y)
  )
;;-------------------------------------------------------
(defun chendiem()
  (setq pt (getpoint "\n Nhap toa do diem chen he truc:"))
  )
;;-------------------------------------------------------
(defun vtx(/ i j k)
  (command "line" pt (polar pt 0 x) "")
  (setq i 0 k 0)
  (while (<= i (length yn))
    (setq j (+ (nth i yn) k))
    (command "line" (polar pt (/ pi 2) j) (polar (polar pt (/ pi 2) j) 0 x) "")
    (setq k j)
    (setq i (1+ i))
    )
)
;;-------------------------------------------------------
(defun vty(/ i j k)
  (command "line" pt (polar pt (/ pi 2) y) "")
  (setq i 0 k 0)
  (while (<= i (length xn))
    (setq j (+ (nth i xn) k))
    (command "line" (polar pt 0 j) (polar (polar pt 0 j) (/ pi 2) y) "")
    (setq k j)
    (setq i (1+ i))
    )
)
 
;;-------------------------------------------------------
(defun bang()
  (noiX)
  (noiY)
  (chendiem)
  (vtx)
  (vty)
  (command)
)

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âu rồi không thấy bác Hoành viết tiếp nhỉ? Những bài viết cua bác (và của nhiều mem khác nữa) rất hữu ích cho những người mới học như tôi. Cảm ơn các bác nhiều nhé!

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ông ty mình đang tuyển sinh viên mới ra trường biết vẽ jwcad lương 7.5tr bạn nhé. bạn nên học phần mềm jw cad vì ít người biết phần mềm này nên rất dễ xin việc bạn nhé. 

thông tin đến bạn.

 

Hiện nay công ty Nhật Bản sang Việt Nam Kinh Doanh rất nhiều về các mảng xây dựng, cơ khí,.. Nên phần mềm jw cad không thể thiếu đối với Công ty Nhật tại Việt Nam. Nhưng chắc có lẽ ít người biết đến phần mềm jw cad này nên Đó là cơ hội, bạn có công việc ổn định về mức lương cũng như chế độ tốt. Vì vậy hôm nay Mình xin giới thiệu đến các bạn các khóa học jw cad. bạn nào học thì liên hệ qua Trung Tâm 

sdt 0165 2049 853.
Xin chân thành cảm ơn

  • Vote giảm 2

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

Bác nào làm ơn cho e hỏi, e có 1 yêu cầu hơi oái oăm là: muốn chỉnh đối tượng đường ghi kích thước (thẳng và chéo) riêng lẻ (là đối tượng được chọn) thành như sau:

-layer: defpoint

-text colour: 1 (đỏ)

-đường kích thước và đường gióng đều là màu 8 (màu ghi)

 

Mà em tìm mãi k biết cách viết, xin các huynh chỉ giáo giùm.

 

HuHu

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

Hề hề: Ko oái oăm đâu. ^^

Gợi ý cho bạn cái code - áp dụng cho 1 lần chọn. Hề hề.

 

(defun c:test ()

 
(setq object (car (entsel "Chon duong kich thuoc: ")))
(setq dxfobject (entget object))
(setq dxfobject (subst (cons 8 "defpoint") (assoc 8 dxfobject) dxfobject))
(entmod dxfobject)
 
 
(VL-LOAD-COM)
(vla-put-TextColor  (vlax-ename->vla-object object) 1 )
(vla-put-DimensionLineColor  (vlax-ename->vla-object object) 8 )
(vla-put-ExtensionLineColor  (vlax-ename->vla-object object) 8 )
(princ))
 

 

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ác bác cho hỏi xíu!

 

Em đang học về hàm lặp "repeat". Muốn chuyển tất cả các đối tượng em chọn về layer "2" (đã tạo sẵn)

Em xài code sau:

 

(defun c:q2()
(setq tdt (ssget))
(setq sdt (sslength tdt))
(setq index 0)
 
(repeat sdt
(setq abc (ssname tdt index)
      index (+ 1 index)
)
(command ".change" abc "" "p" "la" 2 "")
)
(princ)
)
 
 
Nhưng khi chạy thì bị lỗi. Em biết là mình bị nhầm chỗ nào đó nhưng mò mãi không ra. Mong các bác chỉ giáo!

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ác bác cho hỏi xíu!

 

Em đang học về hàm lặp "repeat". Muốn chuyển tất cả các đối tượng em chọn về layer "2" (đã tạo sẵn)

Em xài code sau:

 

(defun c:q2()
(setq tdt (ssget))
(setq sdt (sslength tdt))
(setq index 0)
 
(repeat sdt
(setq abc (ssname tdt index)
      index (+ 1 index)
)
(command ".change" abc "" "p" "la" 2 "")
)
(princ)
)
 
 
Nhưng khi chạy thì bị lỗi. Em biết là mình bị nhầm chỗ nào đó nhưng mò mãi không ra. Mong các bác chỉ giáo!

 

 

Chạy không có lỗi bạ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

Topic này đã bị stop khá lâu không còn bài giảng, hơi tiếc nhỉ? Không phát triển được trong khi thấy có khá nhiều Pro cũng muốn chia sẻ...

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
Vào lúc 17/1/2007 tại 13:08, Nguyen Hoanh đã nói:

Phần 1: bắt đầu

Vào lúc 17/1/2007 tại 13:08, Nguyen Hoanh đã nói:

Phần 1: bắt đầu

 

Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

 

Hãy tạo một file mới và save nó với tên hoclisp.lsp.

(princ "\nChao cadviet")

(princ)

Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

 

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

 

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").

 

Hãy tạo một file mới và save nó với tên hoclisp.lsp.

(princ "\nChao cadviet")

(princ)

Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

 

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

 

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").

Câu lệnh thứ 2 dùng để ẩn kết thúc là câu nào ạ? 

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
Vào lúc 13/6/2016 tại 09:24, dungndgeo đã nói:

Lâu rồi không thấy bác Hoành viết tiếp nhỉ? Những bài viết cua bác (và của nhiều mem khác nữa) rất hữu ích cho những người mới học như tôi. Cảm ơn các bác nhiều nhé!

Giờ mình cũng vừa bắt đầu học đây, mới biết tới cái hàm princ của bác Hoành thôi! ha ha ha...nhờ anh Tiềm truyền lữ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
Vào lúc 17/1/2007 tại 13:21, Nguyen Hoanh đã nói:

Phần 2:

 

Trong phần 1, chúng ta đã xây dựng được 1 chương trình lisp có thể nói là thô sơ nhất thế giới. Và nó có 1 nhược điểm: mỗi lần load thì viết ra lệnh. Muốn viết lại phải appload thêm 1 lần nữa.

 

Để điều khiển được thời điểm viết, và viết được nhiều lần, chúng ta phải định nghĩa một hàm AutoCAD, để mỗi khi gọi hàm này, chương trình sẽ viết ra màn hình text mà không cần phải appload lại file lisp.

 

Trên file hoclisp.lsp, chúng ta thêm mã lệnh để trở thành như sau:

 

(defun c:chao()

(princ "\nChao cadviet")

(princ)

)

 

Như vậy chúng ta đã định nghĩa được một lệnh của AutoCAD mang tên chao, mỗi lần gọi lệnh chao tại dòng nhắc Command, chương trình sẽ viết ra trên màn hình text dòng chữ: Chao cadviet.

 

Trong 2 dòng vừa thêm, hàm defun là hàm định nghĩa lệnh AutoCAD. Có cấu trúc:

(defun tenham() noidungham) trong đó:

- tenham là tên hàm cần định nghĩa, nếu muốn định nghĩa một lệnh trong AutoCAD thì thêm 'C:' vào trước tên hàm.

- noidungham là tập các lệnh mà hàm vừa định nghĩa sẽ thực thi.

Tập hợp các lệnh mà hàm vừa định nghĩa sẽ thực thi không phải là (princ "\n Chao cadviet")) thôi sao ta? sao lại có thêm (princ) 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
7 giờ trước, Nguyễn Quốc Khải đã nói:

Tập hợp các lệnh mà hàm vừa định nghĩa sẽ thực thi không phải là (princ "\n Chao cadviet")) thôi sao ta? sao lại có thêm (princ) nữa?

 

Anh ấy đã giải thích cặn kẻ trên đó bạn.

Muốn biết (princ) có tác dụng gì bạn xoá hoặc khoá dòng đó đi rồi chạy thì sẽ thấy sự khác biệt nhé!

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

Autolisp là ngôn ngữ lập trình bậc cao.

Nó thật sự là nói cho máy hiểu phải làm gì.

Mối cầu lệnh như 1 câu nói. 1 lệnh có cấu trúc là 1 danh sách được viết giữa 2 dấu (). Trong đó đầu tiên là tên lệnh và các tham số của nó. Máy sẽ đọc tên lệnh và dựa trên các tham số để thực hiện.

Do cấu trúc () nên nó sẽ thực hiện từ đầu đến cuối, từ trong ra ngoài. Tức là nó găp 1 lệnh nếu bên trong có lệnh nó sẽ làm bên trong trước.

Ngoại trước lệnh defun lambda là 2 lệnh tạo lệnh là nó ghi nhớ để thực hiện nhóm lệnh khi được gọi. Đây là 2 lệnh tạo lệnh mới.

Các lệnh autolisp luôn trả về 1 giá trị nào đó. Thường là giá trị sau cùng của lệnh. Bạn có thể sử dụng tiếp hay không. Vì lý do này nên thường cuối 1 hàm hay 1 líp thì người ta thường viết thêm (princ) để giá trị hàm trả về là null. (hàm princ ko có tham số nó sẽ trả về null] và bạn sẽ ko thấy gì thể hiện ra.

  • Like 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
8 phút trước, ngokiet đã nói:

Autolisp là ngôn ngữ lập trình bậc cao.

Nó thật sự là nói cho máy hiểu phải làm gì.

Mối cầu lệnh như 1 câu nói. 1 lệnh có cấu trúc là 1 danh sách được viết giữa 2 dấu (). Trong đó đầu tiên là tên lệnh và các tham số của nó. Máy sẽ đọc tên lệnh và dựa trên các tham số để thực hiện.

Do cấu trúc () nên nó sẽ thực hiện từ đầu đến cuối, từ trong ra ngoài. Tức là nó găp 1 lệnh nếu bên trong có lệnh nó sẽ làm bên trong trước.

Ngoại trước lệnh defun lambda là 2 lệnh tạo lệnh là nó ghi nhớ để thực hiện nhóm lệnh khi được gọi. Đây là 2 lệnh tạo lệnh mới.

Các lệnh autolisp luôn trả về 1 giá trị nào đó. Thường là giá trị sau cùng của lệnh. Bạn có thể sử dụng tiếp hay không. Vì lý do này nên thường cuối 1 hàm hay 1 líp thì người ta thường viết thêm (princ) để giá trị hàm trả về là null. (hàm princ ko có tham số nó sẽ trả về null] và bạn sẽ ko thấy gì thể hiện ra.

Biết viết lisp cũng lâu rồi bây giờ mới hiểu được hàm (princ) có lần dùng hàm con có sử dụng hàm (princ) ở cuối và kết quả không lấy được giá trị gì cả nhưng vẫn không hiểu ý nghĩa của hàm (princ) sau đó cứ thử dần và xóa hàm (princ) thì lấy được kết quả nhưng vẫn chưa hiểu sâu xa đến như vậy. Đây là kết quả của việc học không có đào tạo. Cám ơn bạn đã giải thích ý nghĩa của hàm trê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
12 giờ trước, DuongTrungHuy đã nói:

Anh ấy đã giải thích cặn kẻ trên đó bạn.

Muốn biết (princ) có tác dụng gì bạn xoá hoặc khoá dòng đó đi rồi chạy thì sẽ thấy sự khác biệt nhé!

Cảm ơn bạn Huy!

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

×