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ị

Không biết hỏi đây có đúng chổ không nữa, Nếu không đúng xin bỏ qua cho

Tôi có 3 tập hợp list có số phần tử như nhau bây giờ muốn tạo 1 tập hợp lớn mà trong đó 1 tập hợp con chứa 3 phần từ của 3 tập hợp ban đầu. Nói thì dài dòng khó hiểu nhưng nôm na thế này

list1 (a b a v .........)

list2 (12 12 45 45 .....)

list3 (544 658 658 647 ........)

muốn tạo thành list mới

LIST ((a 12 544) (b 12 658) (a 45 658) (v 45 647) (...) ....(...))

Mong mọi người giúp đỡ

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

em đang mày mò học về lips, có cái đề baì như thế này: viết lệnh để vẽ tam giác đều ABC, cạnh dài 100. cạnh AB song song với trục OX. Điểm A do người dùng pick trên màn hình. em viết dòng code như thế này nhưng khi pick  vào các điểm bất kỳ trên màn hình, có lúc thì nó cho tam giác đều đúng yêu cầu, có lúc nó cho tam giác ko đúng yêu cầu ( các tam giác em tô mà xanh ở file kèm theo) có lúc nó lại cho ko phải tam giac, mong các bác chỉ giúp chỗ sai của em, và giải thích giúp em tại sao nó lại cho nhiều kết quả khác nhau như vậy. em xin cảm ơn 

(defun c:TGD (/ p1)

(setq p1 (getpoint "nhap diem p1:"))

(command "line" p1 "@100,0" "")

(command "line" p1 "@100,0" "@100<120" "")

(command "line" p1 "@100<60" ""))http://www.cadviet.com/upfiles/3/33610_bai_tap_5.dwg

 

 

 

(defun c:TGD (/ p1)
(setq p1 (getpoint "nhap diem p1:"))
(command "line" p1 "@100,0" "")
(command "line" p1 "@100,0" "@100<120" "")
(command "line" p1 "@100<60" ""))
(defun c:TGD (/ p1)
(setq p1 (getpoint "nhap diem p1:"))
(command "line" p1 "@100,0" "")
(command "line" p1 "@100,0" "@100<120" "")
(command "line" p1 "@100<60" ""))

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

 

em đang mày mò học về lips, có cái đề baì như thế này: viết lệnh để vẽ tam giác đều ABC, cạnh dài 100. cạnh AB song song với trục OX. Điểm A do người dùng pick trên màn hình. em viết dòng code như thế này nhưng khi pick  vào các điểm bất kỳ trên màn hình, có lúc thì nó cho tam giác đều đúng yêu cầu, có lúc nó cho tam giác ko đúng yêu cầu ( các tam giác em tô mà xanh ở file kèm theo) có lúc nó lại cho ko phải tam giac, mong các bác chỉ giúp chỗ sai của em, và giải thích giúp em tại sao nó lại cho nhiều kết quả khác nhau như vậy. em xin cảm ơn 

(defun c:TGD (/ p1)

(setq p1 (getpoint "nhap diem p1:"))

(command "line" p1 "@100,0" "")

(command "line" p1 "@100,0" "@100<120" "")

(command "line" p1 "@100<60" ""))http://www.cadviet.com/upfiles/3/33610_bai_tap_5.dwg

 

 

 

(defun c:TGD (/ p1)
(setq p1 (getpoint "nhap diem p1:"))
(command "line" p1 "@100,0" "")
(command "line" p1 "@100,0" "@100<120" "")
(command "line" p1 "@100<60" ""))
(defun c:TGD (/ p1)
(setq p1 (getpoint "nhap diem p1:"))
(command "line" p1 "@100,0" "")
(command "line" p1 "@100,0" "@100<120" "")
(command "line" p1 "@100<60" ""))

 

Winter chưa thêm đoạn mã tắt osnap khi vẽ bằng hàm command. Chú ý set và trả lại osnap như ban đầu nhé

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ại sao lại phải 3 lần vẽ bắt đầu từ p1 như vầy hè???

Hề hề hề,

Sao không viết lại ngắn hơn

(command "line" p1 "@100,0" "@100<120" "c" )

Lưu ý: @100<60 sẽ tạo một đường line từ điểm cuối của lệnh line trước đó dài 100 và tạo với trục x góc 60 độ chứ không phải góc 300 độ đâu nhé.

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ại sao lại phải 3 lần vẽ bắt đầu từ p1 như vầy hè???

Hề hề hề,

Sao không viết lại ngắn hơn

(command "line" p1 "@100,0" "@100<120" "c" )

Lưu ý: @100<60 sẽ tạo một đường line từ điểm cuối của lệnh line trước đó dài 100 và tạo với trục x góc 60 độ chứ không phải góc 300 độ đâu nhé.

he, em biết 2 cách viết là như nhau, nhưng vì đang học nên em hơi bảo thủ, muốn làm theo trình tự cho nó khỏi loạn não, ủa  mà cái "c" ở cuối hàm command có ý nghĩa gì vậy bác bình, em chưa hiểu rõ về cấu trúc của cái lệnh command cho lắm, trong tài liệu hướng dẫn thì nói rất đơn gián, nhưng lúc dùng thì có vẻ đa dạng hơ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

he, em biết 2 cách viết là như nhau, nhưng vì đang học nên em hơi bảo thủ, muốn làm theo trình tự cho nó khỏi loạn não, ủa  mà cái "c" ở cuối hàm command có ý nghĩa gì vậy bác bình, em chưa hiểu rõ về cấu trúc của cái lệnh command cho lắm, trong tài liệu hướng dẫn thì nói rất đơn gián, nhưng lúc dùng thì có vẻ đa dạng hơn ... :(

Hề hề hề,

1/- Cái "c" cuối cùng đó có nghĩa là "Close" tức là khép kín line lại. Nó là một trong các option của lệnh line, mà hình như là mọi người ít dùng option này do thường dùng pline để vẽ các đa giác thì phải.

2/- cấu truc của hàm (command ....) là cấu trúc của các lệnh có sẵn trong CAD. Tùy vào cách sử dụng của mỗi lệnh mà các tham số đi theo hàm này thay đổi tương ứng với nó..

Tỷ như lệnh line thì Cad yêu cầu sau khi nhập lệnh thì phải nhập tọa độ của các điểm và có thêm option Close để khép kín các line tạo ra một đa giác. Do vậy hàm (command "line" .....) sẽ có tham số là các tọa độ điểm và tham số "c" tương ứng với việc khép kin các line để tạo thành đa giác.

3/- Chính vì bạn đang học viết lisp nên việc học cách tạo ra lisp càng ngắn gọn càng tốt sẽ giúp bạn hiểu rõ hơn tính năng và tác dụng của các hàm được sử dụng trong lisp.

Chúc bạn học tốt.

PS: lưu ý rằng việc bảo thủ trong học tập cũng là một cách học để nắm vững vấn đề, nhưng bảo thủ trong làm việc thì sẽ có thể gây hại không nhỏ đâ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

Mình đang viết lisp có 1 vướng mắc nhờ mọi người giúp đỡ. 

mình có 1 pline cắt qua các điểm chèn của block bây giờ mình muốn sort các block theo thứ tự  mà pline đi qua (theo chiều của pline) 

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à 1 trong các giải pháp:

- Lấy điểm start hoặc end của pline.

- Sort theo chiều dài (không phải khoảng cách) từ điểm chèn của block đến start hoặc end.

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

1/- Cái "c" cuối cùng đó có nghĩa là "Close" tức là khép kín line lại. Nó là một trong các option của lệnh line, mà hình như là mọi người ít dùng option này do thường dùng pline để vẽ các đa giác thì phải.

2/- cấu truc của hàm (command ....) là cấu trúc của các lệnh có sẵn trong CAD. Tùy vào cách sử dụng của mỗi lệnh mà các tham số đi theo hàm này thay đổi tương ứng với nó..

Tỷ như lệnh line thì Cad yêu cầu sau khi nhập lệnh thì phải nhập tọa độ của các điểm và có thêm option Close để khép kín các line tạo ra một đa giác. Do vậy hàm (command "line" .....) sẽ có tham số là các tọa độ điểm và tham số "c" tương ứng với việc khép kin các line để tạo thành đa giác.

3/- Chính vì bạn đang học viết lisp nên việc học cách tạo ra lisp càng ngắn gọn càng tốt sẽ giúp bạn hiểu rõ hơn tính năng và tác dụng của các hàm được sử dụng trong lisp.

Chúc bạn học tốt.

PS: lưu ý rằng việc bảo thủ trong học tập cũng là một cách học để nắm vững vấn đề, nhưng bảo thủ trong làm việc thì sẽ có thể gây hại không nhỏ đâu.

cảm ơn bác Thanh Binh và bác Tue_NV, em nhìn mãi ko thấy cái nút thank nó ở đâu nên đành phải chiếm dụng thêm chút đất đai của diễn đàn để thêm một comment nữa, bác bình nói rất đúng, em đang trong quá trình sửa cái tính bảo thủ đây bác ạ. bác có biết quyển sách nào viết về lips và có cả bài tập thực hành ko giới thiệu em với, hnay mới có thời gian mò lên Hoa Lư để tìm, mà trên đó nhiều hiệu sách nhỏ quá, ko thể đi tìm hết đ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

Đây là 1 trong các giải pháp:

- Lấy điểm start hoặc end của pline.

- Sort theo chiều dài (không phải khoảng cách) từ điểm chèn của block đến start hoặc end.

Ok 

Nghe qua thì cũng ok rồi đó nhưng không biết viết được đây không (dân tay ngang chủ yếu là chế lisp)???hehehhehe

Nếu được Bác viết cho mình 1 đoạn 

Cám ơn Bác nhiề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

Đây là 1 trong các giải pháp:

- Lấy điểm start hoặc end của pline.

- Sort theo chiều dài (không phải khoảng cách) từ điểm chèn của block đến start hoặc end.

đã sort được rồi

Bác cho em hỏi có hàm nào kiểm tra block có nằm trên đường pline này không (Khoảng cách bằng 0) (cái này để công tác chọn nhanh hơ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

đã sort được rồi

Bác cho em hỏi có hàm nào kiểm tra block có nằm trên đường pline này không (Khoảng cách bằng 0) (cái này để công tác chọn nhanh hơn)

 

Bạn Dùng hàm vlax-curve-getClosestPointTo để kiểm tra điểm p có nằm trên curve © hay khô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

Bạn Dùng hàm vlax-curve-getClosestPointTo để kiểm tra điểm p có nằm trên curve © hay không?.

Có thể lòng hàm vlax-curve-getClosestPointTo  vào hàm chọn SSget không??

cám ơn bạn đã giúp đỡ

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ó thể lòng hàm vlax-curve-getClosestPointTo  vào hàm chọn SSget không??

cám ơn bạn đã giúp đỡ

99% là không thể. Nhưng bạn có thể ssget, sau đó filter.

  • 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

99% là không thể. Nhưng bạn có thể ssget, sau đó filter.

Bạn viết cho mình đoạn này được không 

mình đang tìm cách nhưng không nghỉ ra được

cám ơn bạn nhiề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

Mai nhé, giờ U-19-VN thua hơi đau nên buồn không viết được.

Cám ơn bạn trước nhé chờ tin của bạn 

Chúc bạn mau qua nhanh nổi buồn này (Thua vẫn ngẩng cao đầu)

 

p/s: Mình thì thấy rất chi là vui vì đã có 1 đội U19 như vậy

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

Code nhanh cho bạn đây.

ss : tập chọn các block

ent : pline

 

(defun Check(ss ent / i pt entx)
 (setq ss1 (ssadd))
 (repeat (setq i (sslength ss))
  (setq pt (cdr (assoc 10 (entget (setq entx (ssname ss (setq i (1- i))))))))
  (if (equal (vlax-curve-getClosestPointTo ent pt) pt 1E-8)
   (setq ss1 (ssadd entx ss1))))
 (sssetfirst nil ss1)
 ss1)  
 
  • 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

cho hỏi:

 code như thế nào để chọn các block bị đường pline cắt qua mà không phải zoom all/extents

Khi dùng vlisp để zoom in/out đối với mặt bằng nhỏ thì khii cảm nhận được độ trễ, khi mặt bằng lớn thid sẽ thấy độ trễ khi zoom và thấy không chuyên

 

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

cho hỏi:

 code như thế nào để chọn các block bị đường pline cắt qua mà không phải zoom all/extents

Khi dùng vlisp để zoom in/out đối với mặt bằng nhỏ thì khii cảm nhận được độ trễ, khi mặt bằng lớn thid sẽ thấy độ trễ khi zoom và thấy không chuyên

 

Thanks

Hề hề hề,

Xin trả lời: làm như bác DoanvanHa đã nói tức là chọn tập hợp các block rồi sau đó lọc lấy các block có giao cắt với pline.

  • 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ột câu hỏi lớn:

Có ai đã từng viết lisp về bài toán Dijkstra chưa? Cho xin?

Tôi đang gặp rắc rối, dù đã viết được, nhưng tốc độ vẫn còn quá chậm.

P/S: nếu bạn đọc câu hỏi mà chưa đụng đến thì cũng xin đừng hỏi ngược lại: "Dijkstra là gì?", bởi giải thích hơi bị dài, mà cụ Gồ thì đã 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

Srr xì pam : Chưa đụng đến nhưng bác viết bằng Lisp thì quả là nan giải ^^ Xin chia sẻ sự vất vả với 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

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


×