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

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

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

@Đ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 ạ ^^

  • Vote tăng 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ờ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 ^^

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ờ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ứ!

  • Vote tăng 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

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

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

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

^^ Đ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 ^^

  • Vote tăng 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

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.

  • Vote tăng 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

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)

untitled111_1.png

  • Vote tăng 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

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)

 

untitled111_1.png

Đâ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ì

  • Vote tăng 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 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))
  • Vote tăng 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

Đâ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.

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

  • Vote tăng 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

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?

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

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

 

buttons.png

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 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á ^^

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ậ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 smile.png

Code dài thượt nhưng...mang dấu ấn riêng ...hehe

 

buttons.png

Ủ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".

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

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

 

Ế 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!

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

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

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

Không yêu cầu ngắn hay dài hơn đáp án, nên tạm thời ta dùng :

(setq a (car (vl-remove a (list a nil 100))))
:D
  • Vote tăng 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

Không yêu cầu ngắn hay dài hơn đáp án, nên tạm thời ta dùng :

biggrin.png

 

Kexu hay quá. Nhưng cái a trong list chắc không cần đến,

ý đồ của npham là thay cái if để đơn giản hóa sự lằng nhằng của cái rẻ nhánh , chẳng hạn bác nào có thể đơn giản cái đoạn sau không?:

 

(if

(setq a (getreal "\na:"))

(if

(setq b (getreal "\nb:"))

(if

(setq c (getreal "\nc:"))

(+ a b c)

)

)

)

 

 

Một câu khác, Hãy tính tổng giá trị của tất cả các phần tử trong tất cả các list sau: (l1 +...+l5)

 

(setq l1 '(1))

(setq l2 '(10 20))

(setq l3 '(100 200 300))

(setq l4 '(1000 2000 3000 4000))

(setq l5 '(10000 20000 30000 40000 50000))

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ương tự như Ketxu vậy nhưng khác 1 chút :

(setq a (car(vl-remove nil (list nil a 100))))

 

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

Kexu hay quá. Nhưng cái a trong list chắc không cần đến,

Đúng là cái a không cần đến, lúc trả lời câu hỏi Ket k test CAD mà cứ cho a vào đấy để clear nó đi trước khi setq, thật ngớ ngẩn làm sao ^^

 

2 câu bài vừa rồi :

1- Thường thì người ta dùng AND chứ ít ai dùng như trên ^^ :

(if

(and (setq a (getreal "\na:"))

(setq b (getreal "\nb:"))

(setq c (getreal "\nc:"))

)

(+ a b c)

)

Để tùy biến thêm List thì có thể dùng :

(apply '+ (mapcar '(lambda(x)(set x (getreal (strcat "\n" (vl-princ-to-string x))))) '(a b c)))

 

2-

(apply '+ (append l1 l2 l3 l4 l5))

Hoặc :

(apply '+ (mapcar '(lambda(x)(apply '+ x)) (list l1 l2 l3 l4 l5)))

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ương tự như Ketxu vậy nhưng khác 1 chút :

(setq a (car(vl-remove nil (list nil a 100))))

Sao nó luôn trả về 100?

@npham: sao bạn đố mà người ta trả lời hay cũng chẳng thấy bạn thưởng thank?

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

×