Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
ts088

Tìm hiểu cấu trúc một chương trình lisp

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

ts088    4

Em mới học lisp. Muốn tìm hiểu cấu trúc một CT lisp, các câu lệnh, cú pháp, hàm trong Lisp, bác nào có tài liệu hướng dẫn chỉ giúp em với. ThanK much.

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
ssg    1.088
Em mới học lisp. Muốn tìm hiểu cấu trúc một CT lisp, các câu lệnh, cú pháp, hàm trong Lisp, bác nào có tài liệu hướng dẫn chỉ giúp em với. ThanK much.

Bạn tham khảo ở đây và cho ý kiến:

http://www.cadviet.com/forum/index.php?showtopic=1032

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
ts088    4

Thank SSG, tài liệu rất hữu ích. tui có tham khảo một số bài viết khác của các thành viên trong diễn đàn, nhưng vẫn còn chưa hiểu về cách sử dụng của các biến hệ thống, và một số hàm mở rộng như: vla-, vlax-, vlr... . Nhờ pác chỉ giáo dùm. Thank pá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
ssg    1.088
Thank SSG, tài liệu rất hữu ích. tui có tham khảo một số bài viết khác của các thành viên trong diễn đàn, nhưng vẫn còn chưa hiểu về cách sử dụng của các biến hệ thống, và một số hàm mở rộng như: vla-, vlax-, vlr... . Nhờ pác chỉ giáo dùm. Thank pác.

Biến hệ thống và các hàm của lisp có khá nhiều, ssg cũng không thể (và cũng không cần) nhớ hết! Cần đến cái nào thì lật Help ra xem thôi. Tất nhiên, những cái mình thường hay dùng thì tự nhiên nhớ thuộc lòng.

Ssg thấy rằng, nhiều bạn có vẻ ngại khi đọc help của các phần mềm, có lẽ vì vốn liếng tiếng Anh hơi bị... khiêm tốn? Sự thật thì không cần thiết phải rất thành thạo tiếng Anh mới đọc được. Hầu như help của tất cả các phần mềm đều viết rất khoa học, chi tiết, cụ thể, kèm theo ví dụ minh họa. Bạn quan tâm đến cái gì, chỉ cần gõ vào box Index là nó hiện ra ngay. Có thể bạn chỉ hiểu loáng thoáng, cứ copy ví dụ của nó rồi paste vào dòng Command chạy thử sẽ hiểu rõ hơn. Khi đã hiểu rõ, có thể sửa vài chỗ là tự khắc thành... của mình!

Nếu bạn còn mơ hồ, hãy nêu thắc mắc một cách cụ thể, anh em mới có thể giải đáp được. Chẳng hạn, bạn có thể post lên một đoạn code lisp, đánh dấu chỉ rõ đoạn bạn không hiểu, mình sẽ giải thích cho bạn. Nếu chỉ nói chung chung, để trả lời thỏa đáng e rằng phải viết cả một cuốn sách! Điều đó ngoài khả năng của ssg!

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
ts088    4

Thank SSG. tiếng Eng cũng không đến nỗi kém, nhưng mới bắt đầu đọc còn mơ hồ lắm. bây giờ khá hơn rùi. cám ơn bác đã chỉ giáo nhé. em viết một một đoạn mã lặp nhưng nó không chịu lặp bác chỉ giúp nhé (Hì)

(setq a (getstring "Nhap a"))

(white (/= (substr a 1 2) "1/")

(setq b (getstring "Nhap lai:"))

(setq a B )

)

mục đích là khi yêu cầu nhập dữ liệu (là tỷ lệ bản vẽ), nếu không đúng kiểu "1/..." thì yêu cầu nhập lại, bao giờ nhập đúng mới làm việc tiếp theo.

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
ssg    1.088
Thank SSG. tiếng Eng cũng không đến nỗi kém, nhưng mới bắt đầu đọc còn mơ hồ lắm. bây giờ khá hơn rùi. cám ơn bác đã chỉ giáo nhé. em viết một một đoạn mã lặp nhưng nó không chịu lặp bác chỉ giúp nhé (Hì)

(setq a (getstring "Nhap a"))

(white (/= (substr a 1 2) "1/")

(setq b (getstring "Nhap lai:"))

(setq a B )

)

mục đích là khi yêu cầu nhập dữ liệu (là tỷ lệ bản vẽ), nếu không đúng kiểu "1/..." thì yêu cầu nhập lại, bao giờ nhập đúng mới làm việc tiếp theo.

1) Bạn sai ở chỗ bold: while chứ không phải white!

2) Không cần phải thêm biến b, chỉ cần như sau:

 

(setq a (getstring "Nhap a: "))

(while (/= (substr a 1 2) "1/") (setq a (getstring "Nhap lai:")))

 

hoặc:

 

(setq a "")

(while (/= (substr a 1 2) "1/") (setq a (getstring "Nhap 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
ts088    4

Pác SSG ơi, em đọc lisp vẽ mặt cắt của pác Hoành nhưng có đoạn này em chưa hiểu nhờ pác chỉ giúp:

 

(defun GiaoDT (ent1 ent2)

(setq ob1 (vlax-ename-> ent1)

ob2 (vlax-ename->vla-object ent2)

)

(setq g (vlax-variant-value

(vla-IntersectWith ob1 ob2 acExtendNone)

)

)

(if (/= (vlax-safearray-get-u-bound g 1) -1)

(setq g (vlax-safearray->list g))

(setq g nil)

)

Thankpac.

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
ssg    1.088
Pác SSG ơi, em đọc lisp vẽ mặt cắt của pác Hoành nhưng có đoạn này em chưa hiểu nhờ pác chỉ giúp:

 

(defun GiaoDT (ent1 ent2)

(setq ob1 (vlax-ename-> ent1)

ob2 (vlax-ename->vla-object ent2)

)

(setq g (vlax-variant-value

(vla-IntersectWith ob1 ob2 acExtendNone)

)

)

(if (/= (vlax-safearray-get-u-bound g 1) -1)

(setq g (vlax-safearray->list g))

(setq g nil)

)

Thankpac.

Các lệnh có tiếp đầu ngữ "vla" truy cập đến các properties và method của ActiveX Objects

ActiveX Objects là các đối tượng được xây dựng bằng kỹ thuật ActiveX, cho phép nhiều chương trình, nhiều phần mềm khác nhau cùng hiểu, chia sẻ và tương tác được với cùng một đối tượng. Mình không nhớ đoạn code trên bác Hoành viết ở đâu, cái này để bác Hoành giải thích sẽ cụ thể hơn. Bản thân ssg cũng đang tìm hiểu về ActiveX. Theo ssg hiểu thì ý nghĩa của tiến trình là thế này:

- ent1, ent2 là đối tượng lisp (entity), cụ thể là pline hoặc region

- vlax-ename->vla-object sẽ chuyển chúng thành các ActiveX objects: ob1, ob2

- vlax-variant-value và các hàm tiếp theo lấy thông tin về miền giao và điểm giao của ob1 và ob2 dưới dạng biến variant. Các hàm "truyền thống" của lisp không thể truy cập trực tiếp các variant-value được, cần phải có thủ tục convert cuối cùng:

- vlax-safearray->list: hoàn trả các giao điểm và gán cho biến g kiểu list của lisp

Ssg chỉ biết chung chung như vậy, nhờ bác Hoành và các bạn am hiểu chỉ giáo thêm.

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
Nguyen Hoanh    4.524

Ssg đã giải thích rõ về ý nghĩa của các hàm vlax rồi.

 

Xin giải thích về ý nghĩa của lệnh GiaoDT:

Lệnh GiaoDT(ent1 ent2) là lệnh tìm các giao giữa 2 đối tượng bất kỳ trong AutoCAD. Nếu lệnh này mà viết theo cách cổ điển, rất mất công. Chính vì vậy, chúng ta dùng hàm có sẵn của trong ActiveX của ACAD thì tiết kiệm nhiều công sức.

 

Bản chất của hàm GiaoDT là gọi hàm vla-IntersectWith [2] của phần ACAD ActiveX. Các thao tác còn lại là chuyển đổi dữ liệu từ ename của lisp sang object của ActiveX [1] và ngược lại [3], chuyển dữ liệu Array, Point của ActiveX sang dữ liệu list của lisp.

 

Như vậy, lệnh GiaoDT như trên có 3 phần chính:

[1]. (setq ob1 (vlax-ename-> ent1) ob2 (vlax-ename->vla-object ent2))

[2]. (setq g (vlax-variant-value(vla-IntersectWith ob1 ob2 acExtendNone)))

[3]. (if (/= (vlax-safearray-get-u-bound g 1) -1)(setq g (vlax-safearray->list g))(setq g nil)

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
cuongcv3    1

Các bác giúp e Lisp này với :

- E muốn thao tác (erase, copy, move,...) toàn bộ các đối tượng trên Layer.

VD : Khi nhấn lệnh "ELL" thì Lisp yêu cầu chọn 1 đối tượng Lisp sẽ xóa toàn bộ đối tượng trên Layer có chứa đối tượng đó.

(tương tự như vậy với "CLL" khi muốn copy, "MLL" khi muốn di chuyể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
ssg    1.088
Các bác giúp e Lisp này với :

- E muốn thao tác (erase, copy, move,...) toàn bộ các đối tượng trên Layer.

VD : Khi nhấn lệnh "ELL" thì Lisp yêu cầu chọn 1 đối tượng Lisp sẽ xóa toàn bộ đối tượng trên Layer có chứa đối tượng đó.

(tương tự như vậy với "CLL" khi muốn copy, "MLL" khi muốn di chuyển).

Bạn dùng thử, nếu cần bổ sung thì cho ý kiến:

 

(defun Sel( / lay ss)
(setq lay (cdr (assoc 8 (entget (car (entsel))))))
(setq ss (ssget "X" (list (cons 8 lay))))
)
(defun C:ELL() (command "erase" (sel) ""))
(defun C:CLL() (command "copy" (sel) "" pause))
(defun C:MLL() (command "move" (sel) "" pause))

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
cuongcv3    1
Bạn dùng thử, nếu cần bổ sung thì cho ý kiến:

 

(defun Sel( / lay ss)
(setq lay (cdr (assoc 8 (entget (car (entsel))))))
(setq ss (ssget "X" (list (cons 8 lay))))
)
(defun C:ELL() (command "erase" (sel) ""))
(defun C:CLL() (command "copy" (sel) "" pause))
(defun C:MLL() (command "move" (sel) "" pause))

 

Lệnh hoạt động rất tốt, Thank bác SSG nhiều. :unsure:

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


×