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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

hihi :) laij làm phiền các bác nữa roay ! Em tìm hiểu về các vòng lặp cơ bản mà thấy khó hiểu quá, các bác giúp em giải thích về hàm : REPEAT ,WHILE nhé, ví dụ em có code sau :

(setq M 10 N4)
(repeat 10
 (setq M(+ 2 M))
 (setq N(+ 5 N))
)

thì mình hiểu sao khi kết quả trả về sao 10 lần lặp của N=54, M= 30

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

hihi :) laij làm phiền các bác nữa roay ! Em tìm hiểu về các vòng lặp cơ bản mà thấy khó hiểu quá, các bác giúp em giải thích về hàm : REPEAT ,WHILE nhé, ví dụ em có code sau :

(setq M 10 N4)
(repeat 10
 (setq M(+ 2 M))
 (setq N(+ 5 N))
)

thì mình hiểu sao khi kết quả trả về sao 10 lần lặp của N=54, M= 30

Hàm repeat: số vòng lặp cố định

Hàm while: số vòng lặp phụ thuộc điều kiện đưa vào sau (while (điều_kiện)

Nếu (điều_kiện) => T thì còn lặp, nếu nil thì hết lặp.

Ngoài ra còn có foreach nữa.

Sửa lại thế này chứ

(defun C:CC()
(setq M 10 N 4)
(repeat 10
 (setq M (+ 2 M))
 (setq N (+ 5 N))
))

  • 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

Hàm repeat: số vòng lặp cố định

Hàm while: số vòng lặp phụ thuộc điều kiện đưa vào sau (while (điều_kiện)

Nếu (điều_kiện) => T thì còn lặp, nếu nil thì hết lặp.

Ngoài ra còn có foreach nữa.

Sửa lại thế này chứ

(defun C:CC()
(setq M 10 N 4)
(repeat 10
 (setq M (+ 2 M))
 (setq N (+ 5 N))
))

bác giải thích cách tính của vòng lặp REPEAT giúp em, vd trên thì vòng lặp trả về N= 54 , M= 30, sao lại tính đc vậy ahm.:)

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 giải thích cách tính của vòng lặp REPEAT giúp em, vd trên thì vòng lặp trả về N= 54 , M= 30, sao lại tính đc vậy ahm. :)

Theo VD trên ta lặp 10 lần.

Lúc đầu m=10

Lặp lần 1 ta có m1=m+2=10+2=12

Lặp lần 2 ta có m2=m1+2=12+2=14 (vì lúc này m=12 rồi chứ không còn m=10 nữa)

Lặp lần 3 ta có m3=m2+2=14+2=16

...

Lặp lần 10 ta có m=m9+2=28+2=30

Tương tự với n.

Thân thươ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

Hàm repeat: số vòng lặp cố định

Hàm while: số vòng lặp phụ thuộc điều kiện đưa vào sau (while (điều_kiện)

Nếu (điều_kiện) => T thì còn lặp, nếu nil thì hết lặp.

Ngoài ra còn có foreach nữa.

Hàm While chạy liên tục khi kiểm tra biểu thức Khác nil (không nhất thiết biểu thức phải trả về T, tức không nhất thiết phải là 1 biểu thức boolean), và dừng lại khi biểu thức bằng 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

Nhờ các bác giải thích ý nghĩa của 2 dòng này giúp e:

1.(setq kc (/ (- (distance pd pc) d) (- n 1)))

2.(command ".donut" 0 d pd c^)

Chân thành cảm ơn trướ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

Nhờ các bác giải thích ý nghĩa của 2 dòng này giúp e:

1.(setq kc (/ (- (distance pd pc) d) (- n 1)))

2.(command ".donut" 0 d pd c^)

Chân thành cảm ơn trước.

1). Đặt biến kc bằng (khoảng cách từ điểm pd đến pc) trừ đi giá trị d, sau đó chia cho (n trừ 1).

2). Vẽ 1 Donut có đường kính trong là 0, đường kính ngoài là d, điểm tâm là pd (c^ tương ứng enter).

Thân thươ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

1). Đặt biến kc bằng (khoảng cách từ điểm pd đến pc) trừ đi giá trị d, sau đó chia cho (n trừ 1).

2). Vẽ 1 Donut có đường kính trong là 0, đường kính ngoài là d, điểm tâm là pd (c^ tương ứng enter).

Thân thương!

Cảm ơn bác nhiều nhờ bác giải thích giùm e dòng bôi đen dưới đây với:

(command ".donut" 0 d (polar pc (+ a (* pi 0.75)) d) 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

@quan08 : Dòng bôi đen : = (pi * 0,75) = 3/4 pi. Số Pi được lisp mặc định như số pi ta đang dùng để tính toán hình học giải tích (trừ khi bị định nghĩa lạ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

@quan08 : Dòng bôi đen : = (pi * 0,75) = 3/4 pi. Số Pi được lisp mặc định như số pi ta đang dùng để tính toán hình học giải tích (trừ khi bị định nghĩa lại ^^)

E vẫn chưa hiểu,dòng lệnh này vẽ 1 donut đường kính trong 0 đường kính ngoài d,dòng sau hiểu như thế nào vậy bác.Mong bác chỉ giúp.Thanks.

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ào các bác,e đang tìm hiểu về lisp,e hiểu code sau như thế này:

a1 (list (+ (car p1) a) (+ (cadr p1)) là tọa độ điểm a1 theo phương X là p1+a,theo phương Y là p1+b Nhứng khi viết như thế này thì hiểu ra sao:

(command ".rectangle" p1 (list (+ (car p1) a) (+ (cadr p1) ))

Cảm ơn các bác.

Tức là vẽ cái rectang với cạnh là a và b

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

E vẫn chưa hiểu,dòng lệnh này vẽ 1 donut đường kính trong 0 đường kính ngoài d,dòng sau hiểu như thế nào vậy bác.Mong bác chỉ giúp.Thanks.

Vẽ 1 donut ta cần:

1) Đường kính trong, là 0, đã OK

2) Đường kính ngoài, là d, đã OK

3) Tâm của donut, chính là (polar pc (+ a (* pi 0.75)) d)

4) Chương trình mặc định cho ta vẽ nhiều donut liên tục, nếu dùn ^C hoặc "" thì chương trình sẽ dừng lại.

Còn (polar pc (+ a (* pi 0.75)) d) nghĩa là: tạo 1 điểm bằng hệ toạ độ cực, bằng cách lấy điểm pc làm gốc, với góc lệch so với trục x là (+ a (* pi 0.75)), và cách pc một khoảng cách bằng d.

OK?

  • 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

E vẫn chưa hiểu,dòng lệnh này vẽ 1 donut đường kính trong 0 đường kính ngoài d,dòng sau hiểu như thế nào vậy bác.Mong bác chỉ giúp.Thanks.

Bạn chỉ bôi đen có mấy chữ đó, nên mình giải thích vậy thôi

Để hiểu được, tốt nhất bạn nên đánh thử command donut xem nó yêu cầu những cái gì ?

Mình nói luôn với dòng này, lần sau nếu gặp trường hợp tương tự bạn không bỡ ngỡ nữa

- Command donut cần bạn nhập vào 3 yếu tố

1. Bán kính trong -> trong dòng lisp là 0

2. Bán kính ngoài -> trong dòng lisp là d

3. Điểm đặt -> trong dòng lisp là đoạn (polar pc (+ a (* pi 0.75)) d)

 

Đến đây bạn lại phải nghiên cứu hàm polar để biết vấn đề (Hàm xác định điểm mới dựa vào hướng + khoảng cách so với 1 điểm đã biết)

Ở đây điểm đã biết là pc hướng (góc) = (+ a (*pi 0.75))

Khoảng cách d

  • 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

Cảm ơn bác nhiều nhờ bác giải thích giùm e dòng bôi đen dưới đây với:

(command ".donut" 0 d (polar pc (+ a (* pi 0.75)) d) c^)

Vẽ donut đường kính trong 0 đường kính ngoài d. Đoạn (polar pc (+ a (* pi 0.75)) d) dùng xác định điểm tâm vẽ donut bằng cách từ điểm pc di chuyển theo phương hợp với phương ngang một góc có giá trị a cộng với pi nhân0.75 khoảng cách di chuyển là d. Trong hàm polar thì góc tính bằng radian pi=180 độ.

  • 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

Cảm ơn các bác nhiều,cho e phiền các bác 1 lần nữa,giải thích giùm e dòng này:

(setq a1 (angle pa pb)

Gán cho a1 giá trị góc đo hợp bởi đường thẳng từ điểm pa đến điểm pb với phương ngang. Giá trị trả về tính theo radian.

  • 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

Cảm ơn các bác nhiều,cho e phiền các bác 1 lần nữa,giải thích giùm e dòng này:

(setq a1 (angle pa pb)

@quan08 : tất cả các hàm bạn hỏi đều có cả ví dụ lẫn cách dùng trong Help , tại sao bạn không dùng và tìm hiểu ? Mình không phản ứng việc hỏi, tuy nhiên, hỏi trước khi tìm hiểu lại là cách thức bị động vô cùng. Cứ như thế này thì 1 lisp đơn giản bạn cũng mất hàng chục bài để hỏi th

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ào các bác,e đang tìm hiểu về lisp,e hiểu code sau như thế này:

a1 (list (+ (car p1) a) (+ (cadr p1)) là tọa độ điểm a1 theo phương X là p1+a,theo phương Y là p1+b Nhứng khi viết như thế này thì hiểu ra sao:

(command ".rectangle" p1 (list (+ (car p1) a) (+ (cadr p1) ))

Cảm ơn các bác.

Hề hề hề,

(command ".rectangle" p1 (list (+ (car p1) a) (+ (cadr p1) c)))

Cái ni được hiểu nôm na như sau:

1/- Đoạn lisp này gọi lệnh ".rectangle" trong CAD và thực thi theo yêu cầu của lệnh này.

2/- Lệnh ".rectangle" trong Cad yêu cầu hai đối số là hai điểm xác định tọa độ của hai đầu đường chéo Hình chữ nhật được tạo. Vậy nên sau khi gọi lệnh lisp phải nhập thêm 2 điểm nữa mà điểm đầu là p1, điểm thứ hai là được xác định phụ thuộc vào p1 theo hàm (list (+ (car p1) a) (+ (cadr p1) c))

3/- Và do hiểu vậy nên lisp sẽ tạo ra một hình chữ nhật với độ dài hai cạnh theo các trục x,y là a,c. Điểm bắt đầu vẽ là p1.

 

Hề hề hề,

Vài câu nôm na, hy vọng bạn sẽ hiểu đú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

Get the last command.

Mình đang cần lấy chuỗi tên lệnh cuối cùng đã nhập trong dòng lệnh mà mò mãi chưa ra. Có bác nào có nhu cầu này chưa?

Có 2 cách hiểu lệnh cuối cùng, ví dụ: ta viết 1 code lisp có tên lệnh là (defun C:AA chẳng hạn) rồi gõ lệnh AA để chạy lệnh này

- Lệnh cuối cùng là lệnh trước khi ta chạy lệnh AA. (Mình cần thằng này)

- Lệnh cuối cùng chính là lệnh AA. (thằng này không phải là thằng mình cần, nhưng có cũng tốt, có thể sẽ có ứng dụng hay ho cho 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

Get the last command.

Mình đang cần lấy chuỗi tên lệnh cuối cùng đã nhập trong dòng lệnh mà mò mãi chưa ra. Có bác nào có nhu cầu này chưa?

Có 2 cách hiểu lệnh cuối cùng, ví dụ: ta viết 1 code lisp có tên lệnh là (defun C:AA chẳng hạn) rồi gõ lệnh AA để chạy lệnh này

- Lệnh cuối cùng là lệnh trước khi ta chạy lệnh AA. (Mình cần thằng này)

- Lệnh cuối cùng chính là lệnh AA. (thằng này không phải là thằng mình cần, nhưng có cũng tốt, có thể sẽ có ứng dụng hay ho cho nó)

 

Căng hè ! Có phải là cái thao tác cuối cùng gõ lên dòng lệnh không?

Nếu vậy thì bác thử : (getvar "LASTPROMPT")

 

Còn cái trước cái "lastprompt" thì .... để ngâm cứu tiếp coi.

  • 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

E nghĩ có thể xài qua Reactor.

1 ví dụ :

(defun ST:Reactor-Clear (lstReactor)

(foreach item lstReactor (if (eval item) (progn (vlr-remove (eval item))(set item nil))))

)

(defun ST-Get-List-Command(objReactor lstOfCommand)

(setq #lstCmds (reverse (cons (car lstOfCommand) (reverse #lstCmds))))

)

(ST:Reactor-Clear '(#CmdList1 #CmdList2))

(setq #CmdList1 (vlr-editor-reactor nil '((:vlr-commandended . ST-Get-List-Command))))

(setq #CmdList2 (vlr-editor-reactor nil '((:vlr-unknownCommand . ST-Get-List-Command))))

#lstCmds lưu lại list các lệnh known và unknown.Khi sử dụng lệnh AA thì lấy last list này

  • 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

E nghĩ có thể xài qua Reactor.

1 ví dụ :

 

#lstCmds lưu lại list các lệnh known và unknown.Khi sử dụng lệnh AA thì lấy last list này

Hê hề hề,

Nếu đã có cái list command thì việc lấy các phần tử của nó có nhẽ là không quá khó.

Nếu AA là kết quả của (last lstCmd) thì cái thằng trước AA sẽ là (cadr (reverse lstCmd))

Hề hề hề, các bác cho mình nói leo một chút hỉ??? Trúng trật thì mong các bác chớ giận....

Hề hề hề,

  • 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

Chào các bác!

Cho Tue_NV hỏi 1 câu :

Mình sử dụng hàm sau : (Command "quickcalc")

-> CAD ra hộp thoại quickcalc -> Mình nhập công thức -> Ví dụ : 5*2 -> Enter Ra kết quả là 10

-> Nhấn Apply -> được số 10 ngay dòng Command.

Xin hỏi là làm sao gán giá trị 10 đó cho 1 biến x??

 

Loay hoay mãi chưa ra. Các bác giúp dùm Tue_NV giải pháp

Xin chân thành cảm ơ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

Chào các bác!

Cho Tue_NV hỏi 1 câu :

Mình sử dụng hàm sau : (Command "quickcalc")

-> CAD ra hộp thoại quickcalc -> Mình nhập công thức -> Ví dụ : 5*2 -> Enter Ra kết quả là 10

-> Nhấn Apply -> được số 10 ngay dòng Command.

Xin hỏi là làm sao gán giá trị 10 đó cho 1 biến x??

 

Loay hoay mãi chưa ra. Các bác giúp dùm Tue_NV giải pháp

Xin chân thành cảm ơn

 

Thì ra bác Tuệ muốn lợi dụng Quickcalc của CAD ^^

Đến đây lại phải nhắc lại công dụng của vla-sendcommand thôi ^^

(defun mycalc ( / val)
(command "quickcalc") 
(vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) "\n")
(setq val (getreal)) 
val
)
(setq b (mycalc))

  • Vote tăng 3

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

 

Thì ra bác Tuệ muốn lợi dụng Quickcalc của CAD ^^

Đến đây lại phải nhắc lại công dụng của vla-sendcommand thôi ^^

(defun mycalc ( / val)
(command "quickcalc")
(vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) "\n")
(setq val (getreal))
val
)
(setq b (mycalc))

Cảm ơn KetXu nhiều nhiều. Rất tuyệt

Trước giờ, mình cứ tường là Method SendCommand chỉ có thể thao tác trong 1 lệnh nào đó thôi. Không ngờ nó có thể lấy kết quả của 1 lệnh, cụ thể là lệnh quickCAL

 

Nhân tiện code trên của Ketxu, Tue_NV hỏi thêm 1 tí nữa

Theo mình biết thì hàm getreal cho phép USER dừng lại nhập số thực, nhưng tại sao ở đây :

(setq val (getreal))

Hàm getreal này lại gán luôn giá trị là kết quả của lệnh QuickCAL cho biến VAL???

 

Thanks bạn 1 lần nữ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

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

×