Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
13 replies to this topic

#1 ts088

ts088

    biết zoom

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

Đã gửi 06 August 2007 - 12:09 PM

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

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 06 August 2007 - 01:28 PM

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

#3 ts088

ts088

    biết zoom

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

Đã gửi 11 August 2007 - 01:19 PM

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

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 13 August 2007 - 03:31 PM

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!
  • 0

#5 ts088

ts088

    biết zoom

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

Đã gửi 15 August 2007 - 09:23 AM

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

#6 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 15 August 2007 - 01:43 PM

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: ")))
  • 0

#7 ts088

ts088

    biết zoom

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

Đã gửi 22 August 2007 - 09:04 AM

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

#8 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 24 August 2007 - 10:16 AM

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

#9 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 24 August 2007 - 11:19 AM

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

#10 ts088

ts088

    biết zoom

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

Đã gửi 25 August 2007 - 10:13 AM

Đa tạ các Pác đã chĩ giáo.
  • 0

#11 cuongcv3

cuongcv3

    biết vẽ line

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

Đã gửi 28 August 2007 - 08:45 AM

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

#12 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 28 August 2007 - 09:21 AM

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

  • 0

#13 cuongcv3

cuongcv3

    biết vẽ line

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

Đã gửi 28 August 2007 - 11:24 AM

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:
  • 0

#14 anh.tuan

anh.tuan

    biết lệnh extend

  • Members
  • PipPipPip
  • 196 Bài viết
Điểm đánh giá: 35 (tàm tạm)

Đã gửi 01 April 2014 - 06:28 PM

bạn nào có thể up lai cai bai train trên được không. link hỏng hết rồi.


  • 0