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ị

Xin lỗi bác TrungNgaMy ket đi 2 ngày nay ^^ Ketxu chưa hiểu rõ ý bác : Test hàm Bench tức là làm sao nhỉ ^^

- Hai hàm sosanh và bench không phải do Ketxu viết ^^ Tuy nhiên về cơ bản cơ chế nó cũng như nhau và rất dễ hiểu, đó là :

 

Để lấy điểm mốc thời gian đầu và cuối có thể dựa theo nhiều cách

Ở cả 2 lisp Bench và sosanh bác có thể thấy công việc (getvar "Millisecs")) ở thời điểm đầu và cuối ^^. Ngoài ra còn có CDATE,DATE...

Hàm Testbench của bác viết cũng chính là đi theo con đường như vậy.

 

Nếu bác nghi ngờ, hãy kiểm tra với cách tính thủ công và cách dùng Bench.

Ketxu lấy ví dụ với hàm finditem8 và lấy time bằng _VL-Times cho 1 lần thực hiện hàm nhé :

Thủ công :

(defun test1 () ;thu cong
(setq start (car(_VL-TIMES)))
(repeat 1 ;Hoac so lan khac
(finditem8 4 lst) ; Cong viec can tinh thoi gian
)
(princ (strcat "\n "
(rtos (/ (- (car (_VL-TIMES)) start) 1000.) 2 4)
" secs."
) ;_ strcat
) ;_ princ
)

 

 

 

P/S : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc

Chẳng hiểu sao hàm tam của bạn :

Command: (setq lst (tam 1000 100) a (length lst))

19200

và của mình cho độ dài lst khác nhau :

Command: (setq lst (tam 1000 100) a (length lst))

1200

và các hàm test1 cũng cho kq kg ổn định, có lẽ do hệ thống chăng

Command: (test1)

0.0000 secs."\n 0.0000 secs."

Command: (test1)

0.0000 secs."\n 0.0000 secs."

 

Command: (setq lst (tam 1000 1000) a (length lst))

3000

Command: (test1)

0.0000 secs."\n 0.0000 secs."

Command: (test1)

0.0160 secs."\n 0.0160 secs."

Command: (test1)

0.0000 secs."\n 0.0000 secs."

Command: (test1)

0.0150 secs."\n 0.0150 secs."

 

Do đó, khi thực hiện mình thấy phải chờ 1 thời gian mới có kq mà thời gian trả về có khi là 0.0 mi li giây, nhưng một mi li giây là rất nhỏ.

Bởi vậy mình chưa hiểu ly do vì sao, có khi nào do máy mình nó bị gì

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 TrungNgaMy : ^^ em làm XDDD thì có bao giờ phải xử lý list với dữ liệu lớn đâu ^^ VĐ cũng không quan trọng với em, mà chủ yếu là "vui" mà ^^ Ngoài ra, khi đố 1 câu nào đó, bác cần có đáp án ( chuẩn hoặc gần chuẩn) của nó trước rồi nhé ^^ Hề hề Bài toán bác đưa ra tạm thời e mới nghĩ ra là có công thức tính khoảng cách từ 1 điểm đến 1 đường thẳng vecto (x1,y1) (x2,y2), ta cứ thế mà làm tới thôi chứ hỉ ? P/S : e kiểm nghiệm thấy hàm bác gia_bach trong câu trước nhanh nhứt, có bác nào có kết quả test khác không ạ ?

vđ tìm điểm gần đoạn thẳng nếu nghĩ đơn giản thì ai cũng làm đc. Chỉ cần lập vòng lặp duyệt qua từng line rồi kiểm tra, nếu hình chiếu của điểm nằm trong line thì xét khoảng cách, nếu kg thì xét độ dài từ điểm đến hai đầu đoạn thẳng, cái nào cho trị ngắn nhất thì là nó. Tuy nhiên, vđ ở đây là tốc độ, khi số đoạn thẳng lên đến con số hàng trăm ngàn đoạn thẳng hoặc hơn nữa thì kg đơn giàn chút nào. Sẽ phải có PP nào đó khác hơn thì mới nhanh đc.

Bạn thấy đấy, TH của bạn khá đơn giản nhưng khi duyệt qua từng phần tử để so sánh đã thấy thời gian đáng kể rồi huống chi còn phải kiểm tra độ dài nữa.

Mình tô đoạn màu xanh để nhấn mạnh đây kg phải tìm khoảng cách ngắn nhấ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

Chẳng hiểu sao hàm tam của bạn :

Command: (setq lst (tam 1000 100) a (length lst))

19200

và của mình cho độ dài lst khác nhau :

Command: (setq lst (tam 1000 100) a (length lst))

1200

và các hàm test1 cũng cho kq kg ổn định, có lẽ do hệ thống chăng

Command: (test1)

0.0000 secs."\n 0.0000 secs."

Command: (test1)

0.0000 secs."\n 0.0000 secs."

 

Command: (setq lst (tam 1000 1000) a (length lst))

3000

Command: (test1)

0.0000 secs."\n 0.0000 secs."

Command: (test1)

0.0160 secs."\n 0.0160 secs."

Command: (test1)

0.0000 secs."\n 0.0000 secs."

Command: (test1)

0.0150 secs."\n 0.0150 secs."

 

Do đó, khi thực hiện mình thấy phải chờ 1 thời gian mới có kq mà thời gian trả về có khi là 0.0 mi li giây, nhưng một mi li giây là rất nhỏ.

Bởi vậy mình chưa hiểu ly do vì sao, có khi nào do máy mình nó bị gì

Bác còn băn khoăn về vấn đề gì thì tại sao không đọc code của nó nhỉ. :o

- Hàm Bench delay 1 giây trước khi bắt đầu thực hiện công việc

- Hàm tam e sửa lại từ hàm của bác nhưng chưa KHỬ BIẾN, nếu làm đi làm lại thì list nó cứ thế dài thêm

- Bác thử không làm gì rồi test, và vừa xem HD vừa test xem sao ? ^^ Tốc độ của máy đâu có phải bất biến ?

 

 

 

Hãy thiết kế dữ liệu và giải thuật sao cho khi ta cung cấp một điểm bất kỳ, sẽ trả về số thứ tự đoạn thẳng nằm gần nó nhất (nghĩa là đoạn nối từ điểm đến một điểm bất kỳ trên đoạn thẳng ngắn nhất) nhanh nhất.

vđ tìm điểm gần đoạn thẳng nếu nghĩ đơn giản thì ai cũng làm đc. Chỉ cần lập vòng lặp duyệt qua từng line rồi kiểm tra, nếu hình chiếu của điểm nằm trong line thì xét khoảng cách, nếu kg thì xét độ dài từ điểm đến hai đầu đoạn thẳng, cái nào cho trị ngắn nhất thì là nó. Tuy nhiên, vđ ở đây là tốc độ, khi số đoạn thẳng lên đến con số hàng trăm ngàn đoạn thẳng hoặc hơn nữa thì kg đơn giàn chút nào. Sẽ phải có PP nào đó khác hơn thì mới nhanh đc.

Bạn thấy đấy, TH của bạn khá đơn giản nhưng khi duyệt qua từng phần tử để so sánh đã thấy thời gian đáng kể rồi huống chi còn phải kiểm tra độ dài nữa.

Mình tô đoạn màu xanh để nhấn mạnh đây kg phải tìm khoảng cách ngắn nhất

 

Ketxu dốt hình học, mà đọc đề bài của bác thấy quay mòng mòng. Sao bác không cho cái hình minh họa nhỉ ^^

Bác đã có giải thuật nào chưa , và mức trần của nó là xử lý bao nhiêu lượng Dữ liệu trong bao nhiêu time ??

 

P/S lần 2 : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc

 

P/S2 : 2 ngày tick Thank thuộc về bác Gia_bach hén ^^

Thank các bác rất nhiều. Từ mỗi câu trả lời mình lại học được rất rất nhiều điều ^^

  • 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 còn băn khoăn về vấn đề gì thì tại sao không đọc code của nó nhỉ. :o

- Hàm Bench delay 1 giây trước khi bắt đầu thực hiện công việc

- Hàm tam e sửa lại từ hàm của bác nhưng chưa KHỬ BIẾN, nếu làm đi làm lại thì list nó cứ thế dài thêm

- Bác thử không làm gì rồi test, và vừa xem HD vừa test xem sao ? ^^ Tốc độ của máy đâu có phải bất biến ?

 

 

 

 

 

 

Ketxu dốt hình học, mà đọc đề bài của bác thấy quay mòng mòng. Sao bác không cho cái hình minh họa nhỉ ^^

Bác đã có giải thuật nào chưa , và mức trần của nó là xử lý bao nhiêu lượng Dữ liệu trong bao nhiêu time ??

 

P/S lần 2 : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc

 

P/S2 : 2 ngày tick Thank thuộc về bác Gia_bach hén ^^

Thank các bác rất nhiều. Từ mỗi câu trả lời mình lại học được rất rất nhiều điều ^^

Mình nghĩ cách viết hàm tính thời gian chắc kg có lỗi gì, mà lỗi có lẽ do hệ thống. Kg biết máy các bạn thế nào, máy của mình thực hiện (sau khi tắt hết các ứng dụng, kể cả mạng) vẫn cho kq kg cố định :

Command: (setq lst (tam 10000 10000) a (length lst))

30000

Command: (test1)

0.0620 secs."\n 0.0620 secs."

Command: (test1)

0.0620 secs."\n 0.0620 secs."

Command: (test1)

0.0470 secs."\n 0.0470 secs."

Command: (test1)

0.0470 secs."\n 0.0470 secs."

Command: (test1)

0.0620 secs."\n 0.0620 secs."

Command: (test1)

0.0630 secs."\n 0.0630 secs."

Command: (test1)

0.0620 secs."\n 0.0620 secs."

Command: (test1)

0.0470 secs."\n 0.0470 secs."

Command: (test1)

0.0470 secs."\n 0.0470 secs."

Command: (test1)

0.0630 secs."\n 0.0630 secs."

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ì tại sao bác vẫn lăn tăn về chuyên time đấy nhỉ ^^ Kết quả KHÔNG THỂ CỐ ĐỊNH được, vì thế các chương trình Bench mới có chức năng thực hiện nhiều lần và đưa ra thời gian trung bình ^^

Còn về câu đố của bá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
Ồ, thì tại sao bác vẫn lăn tăn về chuyên time đấy nhỉ ^^ Kết quả KHÔNG THỂ CỐ ĐỊNH được, vì thế các chương trình Bench mới có chức năng thực hiện nhiều lần và đưa ra thời gian trung bình ^^ Còn về câu đố của bác ?

Ừ, kg nói về time nữa.

Vế câu đố mình có hình ảnh đây, trước đây mình có viết trên lisp nhưng nó chạy chậm nên mình để đâu quên mất, để mình viết lại :

Đây là hình ảnh của việc tìm đoạn thẳng gần điểm, các bạn xem thử.

(màu tím là đoạn thẳng trả về, ở hình 1 đoạn màu xanh có khoảng cách (vuông góc) gần điểm nhưng vẫn kg đc chọn, hình 2 có 2 đoạn thỏa yêu cầu) :

doanthanggandiem.jpg

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

Sao nhìn hình và đọc bài bác đố em vẫn chưa hiểu công việc là gì nhỉ :o

nếu hình chiếu của điểm nằm trong line thì xét khoảng cách, nếu kg thì xét độ dài từ điểm đến hai đầu đoạn thẳng

Xét độ dài từ điểm đến 2 đầu là tổng hay hiệu nhỉ ^^ E mù mịt 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

Trong lúc chờ bác TrungNgaMy giải thích rõ hơn, Ketxu có 1 câu đố vui thế này :

Để hiển thị được 1 hộp thoại như bên dưới cần tối thiểu bao nhiêu dòng code lisp / DCL (mỗi dòng là 1 cặp () )

Câu đố này không khó nhưng có thể nhiều người chưa biết ^^

Giải là 5 phát Thanks, trong vòng 1 ngày, mời các bác thư giãn nào :

 

NewBitmapImage-2.jpg

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

Sao nhìn hình và đọc bài bác đố em vẫn chưa hiểu công việc là gì nhỉ :o

 

Xét độ dài từ điểm đến 2 đầu là tổng hay hiệu nhỉ ^^ E mù mịt quá

Mình nói lại cho rõ. Giả sử (chỉ giả sử thôi vì câu đố của mình là bạn phải thiết kế dạng cơ sở dữ liệu) có một list bao gồm tọa độ 2 đầu của vô số line, người sd cung cấp 1 điểm bất kỳ, Hãy trả vị trí của line gần điểm nhất (không phải là khoảng cách vuông góc từ điểm đến line gần nhất). Đơn giản bạn có thể hình dung có một vòng tròn (hoặc vuông) rất nhỏ có tâm tại điểm đó, vòng tròn (hay hình vuông) này sẽ lớn dần đến khi nào nó cắt it nhất 1 line đầu tiên (cũng có TH cắt nhiều line cùng lúckhi các line này đồng qui và đỉnh gần điểm đang xét) thì dừng lại và trả về 1 hoặc các line đó (chú ý là chỉ tìm trong cơ sở dữ liệu tọa độ chứ kg phải trên bản vẽ).

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

Trong lúc chờ bác TrungNgaMy giải thích rõ hơn, Ketxu có 1 câu đố vui thế này :

Để hiển thị được 1 hộp thoại như bên dưới cần tối thiểu bao nhiêu dòng code lisp / DCL (mỗi dòng là 1 cặp () )

Câu đố này không khó nhưng có thể nhiều người chưa biết ^^

Giải là 5 phát Thanks, trong vòng 1 ngày, mời các bác thư giãn nào :

NewBitmapImage-2.jpg

Đáp án đây bạn :

(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)

  • 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

Ồ ồ, giờ thì em đã hiểu. Tại dốt quá nên bác giải thích mấy bài mới vỡ ra khái niệm Line gần điểm nhất của bác ^^ Thế thì vòng tròn tưởng tượng mần chi ^^

Giải thuật đầu tiên :

- Dữ liệu toàn là Line nên entmakex Line invisible, kiểm tra "khoảng cách Line tới điểm" pt bằng hàm

(distance pt (vlax-curve-getClosestPointTo (vlax-ename->vla-object (setq ent (entmakex (list (cons 0 "LINE")(cons 10 p1)(cons 11 p2)(cons 60 1))))) pt))

C1 : kiểm tra distance này với distance trước, làm theo kiểu nổi bọt ^^

C2 :

- Append tất cả vào 1 list Distance, 1 list ename

- Dùng apply 'min để lấy khoảng cách nhỏ nhất + vl-position tương ứng để lấy ename -> suy ra đường thẳng

- Del toàn bộ list ename

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

Đáp án đây bạn :

(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)

 

Nếu chỉ để gọi ra thôi thì mình chỉ cần 2 dòng thôi

(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")

 

: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

 

Nếu chỉ để gọi ra thôi thì mình chỉ cần 2 dòng thôi

(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")

 

:D

(new_dialog "LispEd" (load_dialog "acad.dcl"))

Gọi ra dồi ... dồi "đơ" luôn :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

Bác nào rãnh rỗi giải trí chút ha:

 

Cho 2 đường tròn c1, c2. Vẽ các đoạn tiếp tuyến với cả 2 đường tròn trên (Ôn lại HH tí :D)

 

Chúc các bác vui vẻ.

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

Đáp án đây bạn :

(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)

Hề hề hề,

Hinh như ý của bác ketxu là phải có cả cái code DCL để có được cái hộp thoại giống như bạn ấy hiển thị cơ chứ không phải chỉ là code lisp để gọi hộp thoại.....

Hề hề hề.

Về cái khoản DCL này thì mình vẫn còn đang phải mót, chửa thể thi thố gì được. Tranh thủ ngồi đợi các bác ra tay để mót vậy....

Hề hề hề...

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ề hề hề,

Hinh như ý của bác ketxu là phải có cả cái code DCL để có được cái hộp thoại giống như bạn ấy hiển thị cơ chứ không phải chỉ là code lisp để gọi hộp thoại.....

Hề hề hề.

Về cái khoản DCL này thì mình vẫn còn đang phải mót, chửa thể thi thố gì được. Tranh thủ ngồi đợi các bác ra tay để mót vậy....

Hề hề hề...

Hề hề hề,

Code DCL để có được cái hộp thoại trên nằm ở acad.dcl nên không cần viết nữa bác ạ. Khi cần, thì gọi nó ra thôi. Còn nếu bác muốn xem mặt mũi code DCL như thế nào, bác cứ mở acad.dcl ra là có.

  • 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

Ồ ồ, giờ thì em đã hiểu. Tại dốt quá nên bác giải thích mấy bài mới vỡ ra khái niệm Line gần điểm nhất của bác ^^ Thế thì vòng tròn tưởng tượng mần chi ^^

Giải thuật đầu tiên :

- Dữ liệu toàn là Line nên entmakex Line invisible, kiểm tra "khoảng cách Line tới điểm" pt bằng hàm

(distance pt (vlax-curve-getClosestPointTo (vlax-ename->vla-object (setq ent (entmakex (list (cons 0 "LINE")(cons 10 p1)(cons 11 p2)(cons 60 1))))) pt))

C1 : kiểm tra distance này với distance trước, làm theo kiểu nổi bọt ^^

C2 :

- Append tất cả vào 1 list Distance, 1 list ename

- Dùng apply 'min để lấy khoảng cách nhỏ nhất + vl-position tương ứng để lấy ename -> suy ra đường thẳng

- Del toàn bộ list ename

 

Nhìn qua code của bác ... mình chẳng hiểu gì lắm vì mình chưa có kiến thức về vl. Hôm nào rãnh, bác viết thêm chút chút cho đúng nghĩa giải trí để anh em chứng thực một tý.

Nhưng bác nhớ đầu bài chỉ cho bác tọa độ của line và số thứ tự thôi đấy, bác kg thề dùng những hàm liên quan đến truy xuất dữ liệu đối tượng đâu nhé. ý của mình có thể hình dung như vầy : nếu có file text chứa stt, tọa độ như là (stt x1 y1 x2 y2), khi trên bản vẽ trống trơn, đọc file đó vào xử lý (nhưng kg vẽ chúng ra cad), vẫn tìm đc đáp số. Cám ơn bá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ìn qua code của bác ... mình chẳng hiểu gì lắm vì mình chưa có kiến thức về vl. Hôm nào rãnh, bác viết thêm chút chút cho đúng nghĩa giải trí để anh em chứng thực một tý.

Nhưng bác nhớ đầu bài chỉ cho bác tọa độ của line và số thứ tự thôi đấy, bác kg thề dùng những hàm liên quan đến truy xuất dữ liệu đối tượng đâu nhé. ý của mình có thể hình dung như vầy : nếu có file text chứa stt, tọa độ như là (stt x1 y1 x2 y2), khi trên bản vẽ trống trơn, đọc file đó vào xử lý (nhưng kg vẽ chúng ra cad), vẫn tìm đc đáp số. Cám ơn bác

Hề hề hề,

Không vẽ ra vẫn có thể dùng các công thức hình học giải tích để tính toán được các khoảng cách và so sánh. Tuy nhiên phải học lại lớp 11 đã.

Vậy nếu vẽ ra rồi sau đó xóa đi thì bác TrungNgamy có trao giải không hè????

Hề hề hề,...

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 nào rãnh rỗi giải trí chút ha:

Cho 2 đường tròn c1, c2. Vẽ các đoạn tiếp tuyến với cả 2 đường tròn trên (Ôn lại HH tí :D)

Chúc các bác vui vẻ.

 

Cái này có dùng lisp không bác ^^ Nêu cách vẽ hay cách giải trên lisp, và giải thưởng ??

Nếu nêu cách vẽ thì bài sẽ được chuyển sang mục Đố vui bên Kỹ thuật CAD , khà khà ^^

 

 

Nhìn qua code của bác ... mình chẳng hiểu gì lắm vì mình chưa có kiến thức về vl. Hôm nào rãnh, bác viết thêm chút chút cho đúng nghĩa giải trí để anh em chứng thực một tý.

Nhưng bác nhớ đầu bài chỉ cho bác tọa độ của line và số thứ tự thôi đấy, bác kg thề dùng những hàm liên quan đến truy xuất dữ liệu đối tượng đâu nhé. ý của mình có thể hình dung như vầy : nếu có file text chứa stt, tọa độ như là (stt x1 y1 x2 y2), khi trên bản vẽ trống trơn, đọc file đó vào xử lý (nhưng kg vẽ chúng ra cad), vẫn tìm đc đáp số. Cám ơn bác

 

- Vẫn có thể dùng các công thức toán học để tính toán, nhưng, các đối tượng chỉ là Line, mà tốc độ Entmake Line thì khá nhanh, nếu số lượng tầm 100k Line thì cũng chỉ mất mấy giây thôi, tội gì không sử dụng thế lợi của các thực thể CAD ^^

Giải thuật thứ 2 có thể là về toán học. Nhưng, giả sử muốn đi chi tiết hơn, thì đáp án mẫu của bác, file dữ liệu, file kết quả .. đâu ạ ^^

- Đề bác hỏi giải thuật, nên e chỉ đưa ra cách thức thôi, nếu đúng thì e xin Thanks, sai thì lại ngồi hóng, chứ với ngần ấy thứ bác cung cấp thì để viết nổi nó cũng thành Viết LISP theo yêu cầu, hoặc Hỏi về LISP, hoặc Hướng dẫn Lập trình LISP rồi bác ơi, còn đâu gọi là giải trí nữa ^^

 

P/S : đã tìm ra cách không dùng thực thể CAD. Chờ bác TrungNgaMy đưa ra file dữ liệu làm thử ^^

  • 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

Đáp án đây bạn :

(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)

Cám ơn bác, đáp án của bác là gần phương án của em nhất. Xin tặng bác 3 dấu Thanks ^^

Thực ra, để gọi và thao tác với hộp thoại này, ta chỉ cần 1 dòng thôi :hàm LispED

(lisped "C\U+1EA7n 1 d\U+00F2ng !")

Hàm trả về text trong hộp thoại nếu nhấn OK, 0 nếu nhấn Cancel hoặc Esc và -1 nếu ấn Full Editor

 

Update : Đã thanks xong 2 ngày của bác gia_bach (tính là 8 nháy) và 3 nháy của bác Tuệ ^^ Mọi người ra đề dễ dễ để em kiếm tí nà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

Cám ơn bác, đáp án của bác là gần phương án của em nhất. Xin tặng bác 3 dấu Thanks ^^

Thực ra, để gọi và thao tác với hộp thoại này, ta chỉ cần 1 dòng thôi :hàm LispED

(lisped "C\U+1EA7n 1 d\U+00F2ng !")

Hàm trả về text trong hộp thoại nếu nhấn OK, 0 nếu nhấn Cancel hoặc Esc và -1 nếu ấn Full Editor

 

Update : Đã thanks xong 2 ngày của bác gia_bach (tính là 8 nháy) và 3 nháy của bác Tuệ ^^ Mọi người ra đề dễ dễ để em kiếm tí nào ^^

Thực ra là Ketxu "lừa" thiên hạ thôi. Chứ có rất nhiều cách gọi dialoge bằng chỉ 1 dòng (tức 1 hàm) như Ketxu. Lý do là các hàm này đã lập sẵn trong 1 số file của cad (VD: acad200x.lsp ...). Đáp án của bác Tue_NV là chuẩn. Câu đố này "sao sao ấy", nhưng xét về mặt "đố cho vui" thì cũng vui.

Thân thương!

P/S: nói thêm để đỡ tốn đất: tôi không hề trách Ket đâu, chỉ là vui thôi mà, hơn nữa cũng thêm 1 thông tin để mọi người biết: có 1 số hàm được lập sẵn trong cad để gọi dialoge chỉ bằng 1 dòng (tức 1 hàm). Dù biết vậy nhưng chính tôi cũng bị Ket lừa đấy. 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

 

Cái này có dùng lisp không bác ^^ Nêu cách vẽ hay cách giải trên lisp, và giải thưởng ??

Nếu nêu cách vẽ thì bài sẽ được chuyển sang mục Đố vui bên Kỹ thuật CAD , khà khà ^^

 

 

 

 

- Vẫn có thể dùng các công thức toán học để tính toán, nhưng, các đối tượng chỉ là Line, mà tốc độ Entmake Line thì khá nhanh, nếu số lượng tầm 100k Line thì cũng chỉ mất mấy giây thôi, tội gì không sử dụng thế lợi của các thực thể CAD ^^

Giải thuật thứ 2 có thể là về toán học. Nhưng, giả sử muốn đi chi tiết hơn, thì đáp án mẫu của bác, file dữ liệu, file kết quả .. đâu ạ ^^

- Đề bác hỏi giải thuật, nên e chỉ đưa ra cách thức thôi, nếu đúng thì e xin Thanks, sai thì lại ngồi hóng, chứ với ngần ấy thứ bác cung cấp thì để viết nổi nó cũng thành Viết LISP theo yêu cầu, hoặc Hỏi về LISP, hoặc Hướng dẫn Lập trình LISP rồi bác ơi, còn đâu gọi là giải trí nữa ^^

 

P/S : đã tìm ra cách không dùng thực thể CAD. Chờ bác TrungNgaMy đưa ra file dữ liệu làm thử ^^

Mình gởi các bạn cái file để tạo dữ liệu trước. Dữ liệu thực gấp nhiều lần như thế. Bây giờ mình bận tí việc, khi quay lại mình sẽ viết code tạo danh sách ban đầu. Mình nghĩ cái này cũng tương tự như của Ketxu. Có một danh sách dữ liệu tọa độ 2 đầu từng cạnh. cung cấp một điểm bất kỳ, hãy trả về list vị trí của một hay các đoạn thẳng gần điểm cung cấp trong danh sách trên

http://www.cadviet.com/upfiles/3/timlinegandiem.rar

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ình kg đưa đề tài này vào các yêu cầu về Lisp vì mình kg có ý định nhờ các bạn viết cái này cho đến khi thấy mục "đố vui" nên mình đưa lên "đố cho vui".

Vế cách viết vận dụng lợi thế của cad mình đã viết trên ARX thời cad14 rồi, thấy cũng có những bất tiện.

Cách viết chỉ căn cứ vào dữ liệu tọa độ mình đã viết trên delphi (trả kết quả về cad) với một số giải pháp nhưng vẫn chưa có thời gian kiểm tra nhiều.

Do Lisp kg có kiểu con trỏ và kiểu danh sách của Lisp hơi cứng nhắc nên ngoài cách viết tuần tự mình chưa nghĩ ra cách khác.

Sau đây là hàm tạo danh sách, mình viết trên lisp. các bạn rành vl có thể viết hay hơn :

(defun dxf( name n)
 (cdr (assoc n (entget name)))
)
(defun taodanhsach( / ss i p1 p2)
 (setq ss (ssget "x" '((0 . "line"))))
 (if ss (progn
(setq i 0 l (sslength ss))
(while (< i l)
 	(setq name (ssname ss i))
 	(setq p1 (dxf name 10) p2 (dxf name 11))
 	(setq lst (append lst (list (list p1 p2))))
 	(setq i (1+ i))
)
 ))
 lst
)

 

Từ danh sách ban đầu đó (chỉ có ý nghĩa minh họa), các bạn chế biến sao cho đc như yêu cầu

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 TrungNgaMy : Thật lạ là bác dùng hàm taodanhsach để chọn tập chọn Line -> xuất ra file dữ liệu -> dùng đoạn lisp khác để đọc dữ iệu từ file xuất ra, tính toán và trả về kết quả, trong khi ngay từ bước duyệt qua đối tượng đã có thể tính toán luôn được rồi ^^.Có thể bác còn dùng file dữ liệu đó để làm việc khác, bằng chương trình khác, ngôn ngữ khác ^^.... Thôi không xét đến vấn đề tại sao có list, ta cứ làm 1 hàm kiểm tra khoảng cách điểm đến đường thẳng (khoảng cách theo định nghĩa của bác), với 3 đối số là (p1 p2 p3) (p1 p2 là 2 đầu, p3 là point kiểm tra). Còn bước so sánh nó với các khoảng cách khác thì vẫn vậy thôi ^^.

Đêm về e thử viết 2 hàm (1 : tạo đối tượng, 2 : không tạo đối tượng) để bác Test và so sánh tốc độ xem sao

  • 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

Thực ra là Ketxu "lừa" thiên hạ thôi. Chứ có rất nhiều cách gọi dialoge bằng chỉ 1 dòng (tức 1 hàm) như Ketxu. Lý do là các hàm này đã lập sẵn trong 1 số file của cad (VD: acad200x.lsp ...). Đáp án của bác Tue_NV là chuẩn. Câu đố này "sao sao ấy", nhưng xét về mặt "đố cho vui" thì cũng vui.

Thân thương!

P/S: nói thêm để đỡ tốn đất: tôi không hề trách Ket đâu, chỉ là vui thôi mà, hơn nữa cũng thêm 1 thông tin để mọi người biết: có 1 số hàm được lập sẵn trong cad để gọi dialoge chỉ bằng 1 dòng (tức 1 hàm). Dù biết vậy nhưng chính tôi cũng bị Ket lừa đấy. Hì, hì, hì!!!

Em mắc tội chi với bác hoặc mọi người trên diễn đàn để đáng hay k đáng bị trách ạ ? Tội lừa bịp ạ ???

He, vốn em vẫn còn, mà đọc cm này không dám múa rìu nữa, bị mắng chết ^^

P/S thêm để đỡ tốn đất : em rất thích biết thêm nhiều thứ, bác ĐVH cứ đố vài câu về các hàm lập sẵn trong CAD đó để mọi người cùng giải trí nà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

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

×