Đến nội dung


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

[Hỏi]Đố vui với LISP


  • Please log in to reply
391 replies to this topic

#101 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 September 2011 - 03:47 PM

@ĐVH : bác ơi bác quote bài em đâu :(
@admin : mỗi bài giải đố là 1 bài mang thông tin đáng học hỏi, e thấy không có gì là quá đáng cả. Chẳng qua là tinh thần treo giải có hơi cao nên bị lạm phát thôi, nên vote 1 phiếu giảm cơ cấu giải ạ ^^
  • 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


#102 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 September 2011 - 08:23 AM

Mời các bác phát hiện ra vấn đề của thằng này :

(defun C:TEST ( / i ss)
(if
(setq i 0 ss (ssget ":E:S" '((0 . "LWPOLYLINE"))))
(progn
(foreach n
(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname ss 0))))
(set (read (strcat "P" (itoa (setq i (1+ i))))) n)
(princ (strcat "\nP" (itoa i) " : " (vl-princ-to-string n)))
(princ (strcat "\nNumber of vertex now is = " (itoa i)))
)
(princ (strcat "\nTotal number of vertex is n = " (itoa i)))

;Do sth other

(repeat i
(set (read (strcat "P" (itoa i))) nil )(setq i (1- i))
))
)
)
Chú ý mục Total number ^^
  • 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


#103 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 23 September 2011 - 08:47 AM

Mời các bác phát hiện ra vấn đề của thằng này :


(defun C:TEST ( / i ss)
(if
(setq i 0 ss (ssget ":E:S" '((0 . "LWPOLYLINE"))))
(progn
(foreach n
(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname ss 0))))
(set (read (strcat "P" (itoa (setq i (1+ i))))) n)
(princ (strcat "\nP" (itoa i) " : " (vl-princ-to-string n)))
(princ (strcat "\nNumber of vertex now is = " (itoa i)))
)
(princ (strcat "\nTotal number of vertex is n = " (itoa i)))

;Do sth other

(repeat i
(set (read (strcat "P" (itoa i))) nil )(setq i (1- i))
))
)
)
Chú ý mục Total number ^^

Bỏ từ repeat trở xuống đi chứ!
  • 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.


#104 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 September 2011 - 09:06 AM

Bác ĐVH đã đoán ra được vấn đề , xin tặng bác 2 phát thanks. Biểu thức Lisp bao giờ cũng trả kết quả, và nếu không để ý để nó in ra màn hình thì thật tệ. Tuy nhiên, cách giải quyết không phải là bỏ nó đi, vì những dòng đó cần thiết ^^
  • 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


#105 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 23 September 2011 - 09:39 AM

Bác ĐVH đã đoán ra được vấn đề , xin tặng bác 2 phát thanks. Biểu thức Lisp bao giờ cũng trả kết quả, và nếu không để ý để nó in ra màn hình thì thật tệ. Tuy nhiên, cách giải quyết không phải là bỏ nó đi, vì những dòng đó cần thiết ^^

Nguyên nhân do thằng set. Một là bỏ (repeat.., Hai là bỏ (setq... như dưới đây, Ba là không dùng set (dễ rồi), Bốn là... chưa biết:

(defun C:HA1 ( / i ss)
(if (setq i 0 ss (ssget ":E:S" '((0 . "LWPOLYLINE"))))
(progn
(foreach n (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname ss 0))))
(set (read (strcat "P" (itoa (setq i (1+ i))))) n)
(princ (strcat "\nP" (itoa i) " : " (vl-princ-to-string n)))
(princ (strcat "\nNumber of vertex now is = " (itoa i))))
(princ (strcat "\nTotal number of vertex is n = " (itoa i)))))
(princ))
(defun C:HA2 ( / i ss)
(if (setq i 0 ss (ssget ":E:S" '((0 . "LWPOLYLINE"))))
(progn
(foreach n (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname ss 0))))
(set (read (strcat "P" (itoa (setq i (1+ i))))) n)
(princ (strcat "\nP" (itoa i) " : " (vl-princ-to-string n)))
(princ (strcat "\nNumber of vertex now is = " (itoa i))))
(princ (strcat "\nTotal number of vertex is n = " (itoa i)))
(repeat i
(set (read (strcat "P" (itoa i))) nil))))
(princ))

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


#106 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 September 2011 - 09:47 AM

^^ Đoạn repeat i cuối cùng đó để khử biến, 2 hàm bác viết đều vô tình làm mất tác dụng của nó :) ^^ Cách giải quyết đơn giản nhất là thêm \n vào sau dãy in, thế thôi ^^
  • 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


#107 npham

npham

    biết lệnh rotate

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

Đã gửi 23 September 2011 - 10:03 AM

Bác ĐVH đã đoán ra được vấn đề , xin tặng bác 2 phát thanks. Biểu thức Lisp bao giờ cũng trả kết quả, và nếu không để ý để nó in ra màn hình thì thật tệ. Tuy nhiên, cách giải quyết không phải là bỏ nó đi, vì những dòng đó cần thiết ^^


Vấn đề là hàm này trả về giá trị 0
Cách giải quyết là thêm hàm (princ) làm hàm cuối cùng.
  • 1

#108 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 01 October 2011 - 10:30 AM

Làm sao để gọi Dialoge này bằng LISP ?
(Nếu thấy Dialoge này là hữu ích cho công việc của Bạn thì Thank giùm, không thì thôi)
Hình đã gửi
  • 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.


#109 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 01 October 2011 - 10:53 AM

Làm sao để gọi Dialoge này bằng LISP ?
(Nếu thấy Dialoge này là hữu ích cho công việc của Bạn thì Thank giùm, không thì thôi)

Hình đã gửi

Đây là lời giải :
(ACET-UI-MESSAGE "Co ai giai duoc cau do nay khong" "Do vui" 32)

@Ketxu, npham : Rất cảm ơn 2 bạn đã tham gia giải đố. Đáp án của Ketxu cũng chính là đáp án của Tue_NV.
Sorry mọi người, mấy hôm nay Tue_NV bận quá và cũng xin lỗi bác admin, do muốn mọi người tham gia nhiều hơn, đông hơn nên giải thưởng hơi cao. Chắc phải nghĩ cơ cấu giải thưởng khác thôi. Hì hì
  • 2

#110 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 01 October 2011 - 11:16 AM

Bác Tuệ nhanh hơn rồi ^^ Đa số lispers trong diễn đàn đều đã biết đến hàm này rồi.Thôi thì em quote cái ghi chú lên để mọi người cùng xem vậy :


(acet-ui-message message [caption [type]])

Displays a message box.
Arguments

- message : A text string containing the message to display. Multiple lines may be separated by ' ' characters. - caption : If provided, the caption for the dialog. Defaults to "Error".
- type : If provided, a bitmap of various flags used to achieve different effects.
The following type flags are available:
- Base types
0 = Acet:OK
1 = Acet:OKCANCEL
2 = Acet:ABORTRETRYIGNORE
3 = Acet:YESNOCANCEL
4 = Acet:YESNO
5 = Acet:RETRYCANCEL
Icons
16 = Acet:ICONSTOP
32 = Acet:ICONQUESTION
48 = Acet:ICONWARNING
64 = Acet:ICONINFORMATION

-Default buttons
0 = Acet:DEFBUTTON1
256 = Acet:DEFBUTTON2
512 = Acet:DEFBUTTON3
768 = Acet:DEFBUTTON4

Return Values

Returns one of the following values:
1 = Acet:IDOK
2 = Acet:IDCANCEL
3 = Acet:IDABORT
4 = Acet:IDRETRY
5 = Acet:IDIGNORE
6 = Acet:IDYES
7 = Acet:IDNO
8 = Acet:IDCLOSE
9 = Acet:IDHELP
Library: acetutil.arx

Tuy nhiên đây là cách dùng thông qua ACET, ta cũng hoàn toàn có thể tạo hàm gọi WS.Shell để gọi bảng tương tự (popup) có chức năng tương tự lên , tham khảo LM :

(defun LM:Popup ( title msg flags / wsh res )
(vl-catch-all-apply
(function
(lambda nil
(setq wsh (vlax-create-object "WScript.Shell"))
(setq res (vlax-invoke-method wsh 'popup msg 0 title flags))
)
)
)
(if wsh (vlax-release-object wsh))
res
)
Sử dụng :

(LM:Popup "Do vui" "Co ai giai duoc cau do nay khong ?" (+ 0 36))


  • 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


#111 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 01 October 2011 - 11:19 AM

Đây là lời giải :
(ACET-UI-MESSAGE "Co ai giai duoc cau do nay khong" "Do vui" 32)

@Ketxu, npham : Rất cảm ơn 2 bạn đã tham gia giải đố. Đáp án của Ketxu cũng chính là đáp án của Tue_NV.
Sorry mọi người, mấy hôm nay Tue_NV bận quá và cũng xin lỗi bác admin, do muốn mọi người tham gia nhiều hơn, đông hơn nên giải thưởng hơi cao. Chắc phải nghĩ cơ cấu giải thưởng khác thôi. Hì hì

Trên cả tuyệt vời, bởi 3 lý do:
1). Nhanh như điện.
2). Code ngắn hơn người ra đố, là:
(vlax-invoke-method (vlax-create-object "WScript.Shell") 'popup "Co ai giai duoc cau do nay khong?" 0 "Do Vui" 32)
3). Cái này "chơi" được cả tiếng Việt, còn cái của người ra đố thì chưa tìm ra cách để thể hiện tiếng Việ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.


#112 npham

npham

    biết lệnh rotate

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

Đã gửi 01 October 2011 - 11:37 AM

Với phuơng châm, mỗi câu đố mang 1 thông tin đáng học hỏi. nPham xin đưa ra 1 lời giải khác không dùng ACET hoặc các tools khác.


(defun cadviet-MsgBox (De Noidung Icon / useri1 value)
(vl-load-com)
(setq obj (vlax-get-acad-object))
(setq useri1 (getvar "useri1"))
(acad-push-dbmod)
(vla-eval obj
(strcat
"ThisDrawing.SetVariable \"USERI1\","
"MsgBox (\"" Noidung "\"," (itoa Icon) ",\"" De "\")")
)
(setq value (getvar "useri1"))
(setvar "useri1" useri1)
(acad-pop-dbmod)
value
)
(cadviet-MsgBox "Vi du" "Co ai giai duoc cau do nay khong?" 32)
(cadviet-MsgBox "Vi du" "Giai duoc co thuong khong?" 36)

  • 2

#113 npham

npham

    biết lệnh rotate

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

Đã gửi 01 October 2011 - 11:44 AM

nPham it khi qua "WScript.Shell
Vì cách này khi hiển thị thông báo, nếu vô tình bấm chuột ra ngoài thì cái thông báo này ẩn đi, Không để ý cứ tưởng CAD bị treo.

Mấy bác xem đúng không?
  • 0

#114 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 01 October 2011 - 11:49 AM

Các hàm trên có 1 điểm khác biệt lớn : WS.Script chỉ trả quyền cho CAD khi đã nhận được kết quả từ MessageBox (không thể Esc) còn các hàm sử dụng Msgbox của CAD thì khác, -> tùy nghi sử dụng dựa vào mục đích.
@npham : cách của bác còn áp dụng với editbox nữa thì phải ^^, nhưng sử dụng VBA expression nên...^^, với lại theo e thì 2 hàm dbmod hơi thừa
  • 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


#115 npham

npham

    biết lệnh rotate

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

Đã gửi 01 October 2011 - 11:57 AM

Vậy thì làm thủ công. Tạo DCL, vẽ vector ...lisp "thuần túy", lại việt hóa cả buttons :)
Code dài thượt nhưng...mang dấu ấn riêng ...hehe

Hình đã gửi
  • 0

#116 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 01 October 2011 - 12:32 PM

@bác npham : question mark bác chịu khó vẽ cả grvecs cơ ạ ^^ Có khi phải lập 1 topic gọi là chia sẻ vector list để đem vào DCL xài cho đỡ vật ^^
P/S : dạo này mục đố vui ế quá ^^
  • 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


#117 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 01 October 2011 - 12:39 PM

Vậy thì làm thủ công. Tạo DCL, vẽ vector ...lisp "thuần túy", lại việt hóa cả buttons Hình đã gửi
Code dài thượt nhưng...mang dấu ấn riêng ...hehe

Hình đã gửi

Ủng hộ ý tưởng của npham, và cần Việt hoá cả Title, Msg, Buuton. Hình như chỉ cần 4 hình là đủ, dạng "Cấm", "Cảnh báo", "Nghi vấn", "Thông báo".
  • 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.


#118 npham

npham

    biết lệnh rotate

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

Đã gửi 01 October 2011 - 05:35 PM

@bác npham : question mark bác chịu khó vẽ cả grvecs cơ ạ ^^ Có khi phải lập 1 topic gọi là chia sẻ vector list để đem vào DCL xài cho đỡ vật ^^
P/S : dạo này mục đố vui ế quá ^^


Ế quá hả, vậy đố đại 1 câu cho vui:
Viết câu lệnh dưới đây thành câu lệnh khác tương đương
Điều kiện:
Đảm bảo tra ra của giá trị a và giá trị của hàm
không dùng hàm rẻ nhánh có điều kiện IF, COND...


(if (not a) (setq a 100) (setq a nil))

p/s: Trước đây cũng có topic chia sẻ cách tạo vector để làm logo trên DCL. Nhưng có lẽ vấn đề này ít đem lại hứng thú nên topic đã bị lãng quên.
  • 0

#119 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 01 October 2011 - 05:53 PM


Ế quá hả, vậy đố đại 1 câu cho vui:
Viết câu lệnh dưới đây thành câu lệnh khác tương đương
Điều kiện:
Đảm bảo tra ra của giá trị a và giá trị của hàm
không dùng hàm rẻ nhánh có điều kiện IF, COND...


(if (not a) (setq a 100) (setq a nil))

p/s: Trước đây cũng có topic chia sẻ cách tạo vector để làm logo trên DCL. Nhưng có lẽ vấn đề này ít đem lại hứng thú nên topic đã bị lãng quên.

Chẳng hạn:
(if (null a) (setq a 100) (setq a nil))
(if (= nil a) (setq a 100) (setq a nil))
P/S (6h00): ẹ quá, quên đọc kỹ đề, huhuhu!
  • 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.


#120 npham

npham

    biết lệnh rotate

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

Đã gửi 01 October 2011 - 05:57 PM

Chẳng hạn:
(if (null a) (setq a 100) (setq a nil))
(if (= nil a) (setq a 100) (setq a nil))


Cái này bác không "chẳng hạn" được rồi, vì không được dùng IF, COND mà :D
  • 0