Đến nội dung


Hình ảnh
* * * - - 3 Bình chọn

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


  • Please log in to reply
497 replies to this topic

#101 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 25 April 2009 - 08:39 AM

Chào bạn Tuan_thietkedien,
Cái vướng của bạn có phải là nó luôn đòi bạn nhập tong chieu dai muon cat không?
Cái đó là do trong vòng lặp while bạn đã cho biến t1 chạy tăng dần mỗi khi gặp text khác với các giá trị 1/50, 1/100, 1/200. Mà trong bản vẽ của bãn sẽ có ti tỉ cái text này. Vì thế kết thúc vòng lặp này biến t1 của bạn chắc chắn lớn hơn 0 rồi. Và thế là thằng cu if tiếp theo nó sẽ thực hiện nhiệm vụ của nó là hỏi bạn thôi.
Theo mình thì cái biến t1 của bạn ở đây không được việc gì cả, quẳng béng nó đi bạn ạ. Còn nếu bạn muốn nhập cái tổng chiều dài muốn cắt khi tỷ lệ bản vẽ khác với các tỷ lệ 1/50, 1/100, 1/200 thì chỉ cần đơn giản là sau khi kết thúc vòng lặp while, bạn viết hàm (if (= 0 dcat) (setq ......)) là được bạn ạ.
Trước khi vào vòng lặp while bạn nên đặt trước biến dcat bằng 0 cho chắc ăn.
Hy vọng mình đoán mò đúng cái chỗ bạn vướng.
Chúc bạn thành công.


Chào bạn phamthanhbinh
Thuật toán đơn giản thế mà mình nghĩ hoài cũng không ra. :(
Nội công của mình còn yếu quá , phải tập luyện thêm thôi.
Cám ơn bạn và bạn Tue luôn giúp đỡ nha.
Chúc 2 bạn và mọi người cuối tuần vui vẻ. :(
  • 1

#102 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 April 2009 - 12:23 PM

Chào bạn phamthanhbinh
Bạn phân tích kỹ lưỡng thật.
Thật sự nhiều khi mình viết theo kiểu hên xui đó bạn, có những lúc mình nghĩ hoài mà cũng không ra giải pháp,
bèn viết đại, nếu không đúng sửa lại chút đỉnh. Do đó nhiều khi mình viết được 1 lisp mà không chắc là hiểu nó hết 100%.
Những cái bạn hướng dẫn mình sẽ cố gắng thực hiện, nếu không được nhờ bạn thêm nha.
Trước mắt mình không hiểu biến cục bộ và biến toàn cục đó bạn.
Ví dụ :
(defun c:test ( x / y)
Vậy biến x và y , cái nào là biến cục bộ , cái nào là biến toàn cục.
Bạn giải thích thêm chỗ này tí nha.
:(

Chào bạn Tuan_thietkedien,
Trong cái ví dụ bạn đưa thì x là biến toàn cục (global) và y là biến cục bộ (local) bạn ạ.
Biến toàn cục là biến được sử dụng trong toàn bộ chương trình, sau khi kết thúc nó được lưu lại để sử dụng tiếp cho các chương trình khác có liên quan bạn ạ.
Biến cục bộ là biến chỉ được sử dụng trong chương trình chứa nó, Khi kết thúc chương trình này biến đó được trả về nil nhằm giảm bớt khối lượng làm việc của các chuong trình có liên quan bạn ạ.
Trong ví dụ của bạn, nếu bạn gán cho biến x và y các giá trị nào đó thì kết thúc chương trình giá trị của biến x vẫn giữ nguyên còn giá trị của biến y sẽ là nil bất kể bạn đã làm gì với biến y đó trong suốt quá trình chạy chương trình.
Để hiểu rõ hơn vấn đề này bạn có thể tham khảo trong tài liệu mình đã gửi bạn hoặc trên diễn đàn, bài viết của bác SSG về các biến này trong bài post đầu tiên ở mục này bạn ạ. Ngoài ra trên diễn đàn cũng có nhiều tài liệu để tham khảo về cái này nhưng mình không nhớ rõ lắm , bạn thử tìm kiếm xem nhé.
Chúc bạn vui.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#103 duongsatdn

duongsatdn

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 1657 Bài viết
Điểm đánh giá: 761 (tốt)

Đã gửi 25 April 2009 - 01:03 PM

Chào bạn Tuan_thietkedien,
Trong cái ví dụ bạn đưa thì x là biến toàn cục (global) và y là biến cục bộ (local) bạn ạ.
Biến toàn cục là biến được sử dụng trong toàn bộ chương trình, sau khi kết thúc nó được lưu lại để sử dụng tiếp cho các chương trình khác có liên quan bạn ạ.
Biến cục bộ là biến chỉ được sử dụng trong chương trình chứa nó, Khi kết thúc chương trình này biến đó được trả về nil nhằm giảm bớt khối lượng làm việc của các chuong trình có liên quan bạn ạ.
Trong ví dụ của bạn, nếu bạn gán cho biến x và y các giá trị nào đó thì kết thúc chương trình giá trị của biến x vẫn giữ nguyên còn giá trị của biến y sẽ là nil bất kể bạn đã làm gì với biến y đó trong suốt quá trình chạy chương trình.
Để hiểu rõ hơn vấn đề này bạn có thể tham khảo trong tài liệu mình đã gửi bạn hoặc trên diễn đàn, bài viết của bác SSG về các biến này trong bài post đầu tiên ở mục này bạn ạ. Ngoài ra trên diễn đàn cũng có nhiều tài liệu để tham khảo về cái này nhưng mình không nhớ rõ lắm , bạn thử tìm kiếm xem nhé.
Chúc bạn vui.

Em xin đăng ký một chân đi mót bác Bình đây! mong bác đồng ý nhá!
  • 0

#104 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 April 2009 - 04:19 PM

Em xin đăng ký một chân đi mót bác Bình đây! mong bác đồng ý nhá!

Hì hì,
Bác cứ hay đùa dai,
Mình lọ mọ đi mót được tí chút, bác lại đòi mót lại của mình có mà ăn rễ hử bác. Bác cứ chịu khó vô cánh đồng Cadviet là tha hồ mót, lại chả bị bảo vệ chửi mắng bao giờ. Lâu lâu gặp phải mấy bác khó tính, bác cứ làm quả ofline là lại oke salem, xem xem giống bu cháu ngay ấy mà.
Cái đời đi mót nhiều khi cũng tủi lắm bác ạ. Thế nhưng mà vui ra phết. Đi mãi mới tìm được cái đồng Cadviet màu mỡ, mót mãi chửa hết bác ạ. Bác mà khoái thì cứ theo mình vào đó mót bác nhé.
Chúc bác năng nhặt chặt bị bác ạ.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#105 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 27 April 2009 - 11:09 AM

Chào bạn phamthanhbinh

Mình cố lắm rồi cũng chỉ giải quyết được tới đây. Lisp chỉ có thể cắt Line theo phương X hay phương Y khi các Line ấy vuông góc với nhau thôi. Còn khi nào cắt theo phương X hay phương Y mình nhờ code của bạn Tue_NV để lấy điêm đầu và điểm cuối của 1 Line. Nếu 1 Line có tung độ điểm đầu = tung độ điểm cuối thì Line ấy nằm phương X.

(defun c:test ( / ss SoDoiTuong i cs1 cs2 ei dd dc osold TapGiaoDiem DoiTuongY DoiTuongX 
sodoituongx sodoituongy pt1 pt2 taptext j e d d1 dcat )
(vl-load-com)
(setq osold (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget '((0 . "LINE,LWPOLYLINE")))
taptext (ssget "x" '((0 . "TEXT")))
sodoituong (sslength ss)
sodoituongx 0 sodoituongy 0 TapGiaoDiem 0 i 0 j 0 dcat 0 cs1 0 cs2 0
)
;;;So sanh so luong giua SoDoiTuongX va SoDoiTuongY
(while (< i sodoituong)
(setq ei (ssname ss i))
(setq dd (vlax-curve-getStartPoint ei))
(setq dc (vlax-curve-getEndPoint ei))
(if (= (cadr dd) (cadr dc))
(setq sodoituongx (1+ sodoituongx))
(setq sodoituongy (1+ sodoituongy))
)
(setq i (1+ i))
)
;;;Lay noi dung TEXT
(while (< j (sslength taptext))
(setq
e (ssname taptext j)
d (entget e)
d1 (cdr (assoc 1 d))
)
(if (= d1 "1/50") (setq dcat 50))
(if (= d1 "1/100") (setq dcat 100))
(if (= d1 "1/200") (setq dcat 200))
(setq j (1+ j))
)
(if (= dcat 0)
(setq dcat (getint "\nTong chieu dai muon cat: ")))
;;;Cat doi tuong
(repeat SoDoiTuong
(setq DoiTuongx (ssname ss cs1)
cs2 (+ cs1 1)
)
(repeat (- SoDoiTuong cs1 1)
(setq
DoiTuongy (ssname ss cs2)
TapGiaoDiem (GiaoDT DoiTuongx DoiTuongy)
cs2 (+ cs2 1)
)
;;;DoituongX > DoituongY --> Cat Y
(if (>= SoDoiTuongx SoDoiTuongy)
(foreach diemgiao TapGiaoDiem
(setq
pt1(list (+ (car diemgiao) dcat) (+ (cadr diemgiao) 0) 0)
pt2(list (- (car diemgiao) dcat) (+ (cadr diemgiao) 0) 0)
)
(command ".break" doituongx pt1 pt2)
(command ".break" doituongy pt1 pt2)
))
;;;DoituongX < DoituongY --> Cat X
(if (< SoDoiTuongx SoDoiTuongy)
(foreach diemgiao TapGiaoDiem
(setq
pt1(list (+ (car diemgiao) 0) (+ (cadr diemgiao) dcat) 0)
pt2(list (+ (car diemgiao) 0) (- (cadr diemgiao) dcat) 0)
)
(command ".break" doituongx pt1 pt2)
(command ".break" doituongy pt1 pt2)
))

);End repeat1
(setq cs1 (+ cs1 1))
);End repeat2

(setvar "osmode" osold)
(princ)
);End

(defun GiaoDT (ent1 ent2)
(setq ob1 (vlax-ename->vla-object 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)
)
(if g
(progn
(setq kq nil
sd (fix (/ (length g) 3))
)
(repeat sd
(setq kq (append kq (list (list (car g) (cadr g) (caddr g))))
g (cdddr g)
)
)
kq
)
nil
)
)

  • 0

#106 binharch77

binharch77

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 372 Bài viết
Điểm đánh giá: 163 (tàm tạm)

Đã gửi 27 April 2009 - 11:33 AM

mình thấy hiện nay cad đã hỗ trợ rất nhiều trong thực hiện các lệnh phức tạp. tại sao vẫn có nhiều người đặt câu hỏi về vđ cad đã có và dùng lisp nhỉ???
vđ/ có t/c cá nhân 1 tí, các bác thông cảm
  • 0

#107 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 27 April 2009 - 12:17 PM

Mình thấy trên diễn đàn các bạn hay dùng hàm tìm giao điểm hai đối tượng như thế này : (vla-IntersectWith ob1 ob2 acExtendNone), nhưng chỉ với đối tượng 2D. Còn đối tượng 3D có cao độ bất kỳ thỉ dùng như thế nào, có tìm đc giao điểm không? Có thể tìm đc giao điểm của chúng trên mặt phẳng XY mà không làm thay đổi dữ liệu của chúng đc kg? Bạn nào biết, xin chỉ giúp. Cám ơn
  • 0

#108 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 28 April 2009 - 10:43 AM

Chào bạn phamthanhbinh

Mình cố lắm rồi cũng chỉ giải quyết được tới đây. Lisp chỉ có thể cắt Line theo phương X hay phương Y khi các Line ấy vuông góc với nhau thôi. Còn khi nào cắt theo phương X hay phương Y mình nhờ code của bạn Tue_NV để lấy điêm đầu và điểm cuối của 1 Line. Nếu 1 Line có tung độ điểm đầu = tung độ điểm cuối thì Line ấy nằm phương X.

.....................

Chào tuan_thietkedien
Bạn tham khảo bài viết này http://www.cadviet.c...o...c=10514&hl=
chắc chắn sẽ giải quyết được vấn đề của bạn.
  • 2

#109 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 28 April 2009 - 04:54 PM

Chào tuan_thietkedien
Bạn tham khảo bài viết này http://www.cadviet.c...o...c=10514&hl=
chắc chắn sẽ giải quyết được vấn đề của bạn.


Chào bác gia_bach
Cái lisp này ghê ghớm thật, Line nghiêng xéo cỡ nào cũng cắt, hoàn toàn đúng ý của em.
3 chức năng cắt thật là rất hữu ích, nhất là chức năng thứ 3 í, cái đó em thích nhất. :(
Em cám ơn bác nhiều lắm.
Chúc bác luôn vui vẻ.
:(
  • 0

#110 tiger99

tiger99

    biết vẽ line

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

Đã gửi 03 May 2009 - 10:24 PM

Cái này dùng Getpoint để lấy điểm đầu và điểm cuối của một LINE nên có thể không chính xác nếu việc chọn bắt dính không chính lung tung

BÁC SSG ơi em theo chân bác cũng kha kha rồi. Em xin hỏi cách nào để biết kiểm tra trương trình của minh viết sai ko nhi?
cách cho môt dòng lệnh chay thử như thế nào?
Bác giúp em với hoặc anh em nào biết giúp cái nhé!
  • 0

#111 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 09 May 2009 - 01:38 PM

BÁC SSG ơi em theo chân bác cũng kha kha rồi. Em xin hỏi cách nào để biết kiểm tra trương trình của minh viết sai ko nhi?
cách cho môt dòng lệnh chay thử như thế nào?
Bác giúp em với hoặc anh em nào biết giúp cái nhé!

Chào bạn Tiger99,
Bạn soạn lisp trên notepad phải không? Như vậy cách duy nhất là truy tìm thủ công thôi bạn ạ. Mình biết có một số phần mềm chuyên dùng cho lập trình có thể giúp bạn kiểm soát lỗi cú pháp khi viết. Với lisp thì bạn có thể dùng notepad++ bạn ạ. Tuy nhiên mình cũng chưa xài nó nên chưa biết rõ lắm, chỉ mới nghe như vậy. Bạn thử tìm hiểu xem.
Còn một cách khác là bạn vào diễn đàn post đoạn lisp đó trong khung
 ....
. Cách này hơi nhiêu khê mà đôi khi cũng không chuẩn lắm.
Để chạy thử một dòng code lisp bạn có hai cách như sau:
- Dùng debug
- Nhập thẳng đoạn code đó vào dònh lệnh command của cad rồi nhấn enter.
Chúc bạn vui và thành công
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#112 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 09 May 2009 - 01:41 PM

BÁC SSG ơi em theo chân bác cũng kha kha rồi. Em xin hỏi cách nào để biết kiểm tra trương trình của minh viết sai ko nhi?
cách cho môt dòng lệnh chay thử như thế nào?
Bác giúp em với hoặc anh em nào biết giúp cái nhé!

Chào bạn Tiger99,
Bạn soạn lisp trên notepad phải không? Như vậy cách duy nhất là truy tìm thủ công thôi bạn ạ. Mình biết có một số phần mềm chuyên dùng cho lập trình có thể giúp bạn kiểm soát lỗi cú pháp khi viết. Với lisp thì bạn có thể dùng notepad++ bạn ạ. Tuy nhiên mình cũng chưa xài nó nên chưa biết rõ lắm, chỉ mới nghe như vậy. Bạn thử tìm hiểu xem.
Còn một cách khác là bạn vào diễn đàn post đoạn lisp đó trong khung
 ....
bằng cách sử dụng các mã "[" code "]" ở đầu chương trình và các mã "["/code"]" ở cuối chương trình. Cách này hơi nhiêu khê mà đôi khi cũng không chuẩn lắm.
Để chạy thử một dòng code lisp bạn có hai cách như sau:
- Dùng debug
- Nhập thẳng đoạn code đó vào dònh lệnh command của cad rồi nhấn enter.
Chúc bạn vui và thành cống
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#113 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 09 May 2009 - 02:22 PM

Chào bạn Tiger99,
Bạn soạn lisp trên notepad phải không? Như vậy cách duy nhất là truy tìm thủ công thôi bạn ạ. Mình biết có một số phần mềm chuyên dùng cho lập trình có thể giúp bạn kiểm soát lỗi cú pháp khi viết. Với lisp thì bạn có thể dùng notepad++ bạn ạ. Tuy nhiên mình cũng chưa xài nó nên chưa biết rõ lắm, chỉ mới nghe như vậy. Bạn thử tìm hiểu xem.
Còn một cách khác là bạn vào diễn đàn post đoạn lisp đó trong khung

 ....
bằng cách sử dụng các mã "[" code "]" ở đầu chương trình và các mã "["/code"]" ở cuối chương trình. Cách này hơi nhiêu khê mà đôi khi cũng không chuẩn lắm.
Để chạy thử một dòng code lisp bạn có hai cách như sau:
- Dùng debug
- Nhập thẳng đoạn code đó vào dònh lệnh command của cad rồi nhấn enter.
Chúc bạn vui và thành cống

Bạn đọc thêm bài viết này :

Em dùng VL editor từ khi bắt đầu học viết lisp. Và thấy nó có đầy đủ các chức năng, biên dịch, gỡ rối, check value ...và đặc biệt là cả tự động format (định dạng các funtion theo indent để dễ nhìn, dễ sửa) Em thấy dùng VL đối với coding lisp là khá hoàn thiện và đầy đủ đấy chứ (nếu biết các dùng và các phím tắt nữa). Từ việc sắp xếp các cửa sổ (khi mở VL ra lần đầu, bao giờ CAD cũng tự động sắp xếp để thuận tiện nhất cho ng lập trình) Đây là hình cửa sổ em vẫn hay dùng:
Hình đã gửi
Sử dụng VL thành thạo cũng giúp cho việc coding nhanh hơn.

http://www.cadviet.c...amp;#entry32931
  • 0

#114 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 09 June 2009 - 11:31 AM

Em đang học cách viết list nên có nhiều lệnh chưa hiểu được mong các bác giúp đỡ. Nhờ các bác đọc list này rồi chỉ cho em tác dụng và cú pháp của các lệnh nay với nhé:
cons
foreach
vl-sort
lambda
(vl-load-com)

Luôn tiện đây cho em hỏi cách đưa nội dung list lên bài viết để mà vẫn giữ được màu các câu lệnh.
Cảm ơn nhiều!

;*****************************
(defun c:cdt (/ sst lstent egoc pgoc xgoc yht zgoc linespc ee tt)
(if (not tyledong)
(setq tyledong 1.5)
)
(princ "\nC¨n kho¶ng c¸ch dßng text")
(setq sst (ssget '((0 . "TEXT")))
lstent (ss2ent sst)
tmp (getreal (strcat "\nVµo tØ lÖ kho¶ng c¸ch dßng <" (rtos tyledong 2 2) ">: "))
tyledong (cond (tmp tmp) (t tyledong))
lstent (vl-sort lstent '(lambda (e1 e2) (> (cadr (cdr (assoc 10 (entget e1))))
(cadr (cdr (assoc 10 (entget e2)))))))
egoc (car lstent)
lstent (cdr lstent)
pgoc (cdr (assoc 10 (entget egoc)))
xgoc (car pgoc)
yht (cadr pgoc)
zgoc (caddr pgoc)
hgoc (cdr (assoc 40 (entget egoc)))
linespc (* hgoc (+ 1.0 tyledong))

)
(foreach ee lstent
(setq tt (entget ee)
tt (subst (list 10 xgoc (setq yht (- yht linespc)) zgoc) (assoc 10 tt) tt)
)
(entmod tt)
(entupd ee)
)
(princ)
)

;-------------------------------

(defun ss2ent (ss / sodt index lstent)
(setq
sodt (cond (ss (sslength ss)) (t 0))
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
(vl-load-com)
  • 0

#115 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 09 June 2009 - 06:19 PM

Em đang học cách viết list nên có nhiều lệnh chưa hiểu được mong các bác giúp đỡ. Nhờ các bác đọc list này rồi chỉ cho em tác dụng và cú pháp của các lệnh nay với nhé:
cons
foreach
vl-sort
lambda
(vl-load-com)

Luôn tiện đây cho em hỏi cách đưa nội dung list lên bài viết để mà vẫn giữ được màu các câu lệnh.
Cảm ơn nhiều!


* (vl-load-com) để load các hàm visual lisp, là các hàm có chữ đứng trước là vl- vlax- vla- vlr- .

* cons để ghép 1 phần tử vào đầu 1 list, kết quả trả về 1 list mới.
Td: (cons "a" (list "b" "c" "d")) -> ("a" "b" "c" "d")
hoặc nối 2 phần tử để tạo 1 list.
Td: (cons "a" "b") -> ("a" . "b") . List kiểu này gọi là dotted pairs vì có dấu chấm đứng giữa.

* foreach là vòng lặp ứng với từng phần tử của list.
Td: (foreach a (list 1 2 3) (print a)) -> in ra 1 2 3
Tức là ứng với mỗi ptử (đặt tên là a) thì (print a).

* vl-sort là để sắp xếp 1 list theo thứ tự nào đó do hàm lambda (hàm tạm) hoặc các hàm của lisp định nghĩa.
Td: (vl-sort (list 5 4 7 8 9 2 3) '<) -> (2 3 4 5 7 8 9) sắp xếp theo thứ tự tăng dần.

Muốn đưa nội dung list lên bài viết để mà vẫn giữ được màu các câu lệnh, thì xem phần Trợ giúp BB code ở mục code và codebox.
  • 1

#116 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 12 June 2009 - 01:18 PM

Truyền tham số cho hàm bằng tham chiếu (by reference)
* Mục đích: thay đổi giá trị của biến khi gọi chương trình con
Để biết cách dùng, tôi xin đưa ra 1 VD
Hàm này để người dùng nhập vào 1 số nguyên n, nếu n chưa có giá trị, sẽ lấy giá trị default.
nếu n có rồi thì lấy trị này làm trị default khi user nhấn enter.
Đây là VD để minh họa cho cách dùng tham biến, còn ưu điểm của cách dùng tham biến chỉ thể hiện rõ ràng khi truyền nhiều tham biến cho hàm, hoặc hàm này gọi thêm các hàm con khác nưã.
(vl-load-com)
(defun mygetint(isym msg def / s n1 n2)
(setq s (if msg msg (strcat "\nNhap so nguyen " (vl-symbol-name isym))))
(setq n2 (eval isym) n1 (if n2 n2 def))
;(setq n2 (eval isym) n1 (if (= (type n2) 'INT) n2 def))
(setq n2 (getint (strcat s " <" (itoa n1) ">:")))
(set isym (if n2 n2 n1))
)

Giải thích code:
- (vl-symbol-name isym) : trả về tên của symbol isym (uppercase)
- (eval isym) : lấy giá trị của isym
- (set isym (if n2 n2 n1)) : gán giá trị cho isym
- Khi truyền tham số bằng tham chiếu, đặt 1 dấu nhấy đơn vào trước tên biến
- Dòng code comment dùng cho ai đặt tên biến toàn cục không thống nhất, lúc dùng int, lúc dùng real ..

3 VD về cách dùng hàm mygetint:
(mygetint 'n nil 0) 
(mygetint 'row "\nNhap so hang" 5)
(setq col 4) (mygetint 'col "\nNhap so cot" 10)
Tương tự như vậy, các bạn có thể viết hàm mygetreal ....
  • 0

#117 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 12 June 2009 - 02:18 PM

Cho mình hỏi một điều :
Ở các ngôn ngữ khác như C++, Java thường có trường hợp có nhiều hàm cùng tên nhưng có số đối số khác nhau.
Td
MyFunc ( a )
MyFunc ( a c)
MyFunc ( a b c)

Trong lisp thì không có chuyện đó, nhưng các hàm của lisp đều có thể nhận số đối số khác nhau.
Td:
(rtos 1.234)
(rtos 1.234 2)
(rtos 1.234 2 1)
CAD đều chấp nhận đc cả.

Có thể là các hàm đó đc viết bằng ngôn ngữ khác, nhưng xin hỏi có cách nào mà hàm do người dùng định nghĩa làm đc như vậy ko?
  • 0

#118 hoangkh

hoangkh

    biết zoom

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

Đã gửi 11 July 2009 - 12:20 AM

Tổng kết: Bạn cần hiểu rõ và biết áp dụng tất cả các hàm đã liệt kê ở Summary.
Vậy Summary là cái gì, em muốn tìm để học từ đầu, đừng cười em vì em không biết về lập trình nên không hiểu được các câu lệnh
  • 0

#119 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 14 July 2009 - 07:46 AM

Tổng kết: Bạn cần hiểu rõ và biết áp dụng tất cả các hàm đã liệt kê ở Summary.
Vậy Summary là cái gì, em muốn tìm để học từ đầu, đừng cười em vì em không biết về lập trình nên không hiểu được các câu lệnh

Summary nghĩa là "tóm lược", "tóm tắt", "toát yếu"... Ở cuối mỗi đoạn code ví dụ, ssg nêu cái "summary" để các bạn mới làm quen với lisp biết được những điều cơ bản tối thiểu cần nắm vững. Chẳng hạn, sau bài đầu tiên có đoạn:

;;;SUMMARY: setq, getreal, getpoint, polar, list, car, cadr, caddr, + - * /, command, comment, getvar, setvar, princ

Nghĩa là: bạn cần phải hiểu và biết áp dụng "setq", "getreal", "getpoint"... "princ".
Chỉ cần từng ấy thôi bạn đã có thể lập được một số chương trình ứng dụng hữu ích. Khi đã thuần thục những cái nêu trên, bạn sẽ tìm hiểu thêm những cái khác. Để hiểu được chúng, như ssg đã trình bày trong bài hướng dẫn, bạn cần phải có sách: mua ở nhà sách, ebook (trên diễn đàn cũng có vài cuốn), đọc help.... Ngoài ra, bạn có thể tham khảo thêm rất nhiều lisp đã post trên diễn đàn.
Chúc bạn thành công!
  • 2

#120 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 15 July 2009 - 03:19 PM

Chào mọi người,
Em muốn dùng Lísp để tác động đến Pagésetup như file đính kèm, ai biết xin chỉ giúp.
Phần windơw chọn khung bản vẽ, có cách nào để Lísp hiểu khung rectangle lớn nhất hay không?
http://www.cadviet.c...les/Book1_7.xls
Xin cám ơn.
  • 0