Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Thaistreetz

Lisp lấy tập hợp tọa độ giao điểm

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

thai1.jpg

Trong hình trên em có n đường thẳng song song nằm ngang.

Em đang cần một đoạn code có tác dụng lấy được tập hợp tất cả các tọa độ giao điểm và tập hợp tọa độ các điểm đầu của các đường thẳng nằm ngang khi em vẽ một đường thẳng cắt qua những đường thẳng nằm ngang này. Các Huynh giúp em với. :s_big:

Edit: em chỉ cần lấy tọa độ của các điểm đầu phía trái (phía có tọa độ x 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
thai1.jpg

Trong hình trên em có n đường thẳng song song nằm ngang.

Em đang cần một đoạn code có tác dụng lấy được tập hợp tất cả các tọa độ giao điểm và tập hợp tọa độ các điểm đầu của các đường thẳng nằm ngang khi em vẽ một đường thẳng cắt qua những đường thẳng nằm ngang này. Các Huynh giúp em với. :s_big:

Edit: em chỉ cần lấy tọa độ của các điểm đầu phía trái (phía có tọa độ x nhỏ)

Bạn tham khảo đoạn code này

(defun C:TG( / n p1 p2 p3 p4 p listDD listDG)
 (defun dxf( name code)
(cdr (assoc code (entget name)))
 )
 (setq n (entsel "Chon doan thang cat"))
 (if n (progn
(setq n (car n))
(setq p1 (dxf n 10) p2 (dxf n 11) listDD nil listDG nil)
(if (setq ss (ssget "f" (list p1 p2) '((0 . "line")))) (progn
  (setq i 0)
  (while (< i (sslength ss))
	(setq n (ssname ss i))
	(setq p3 (dxf n 10) p4 (dxf n 11))
	(if (setq p (inters p1 p2 p3 p4)) (progn
	  (setq listDG (append listDG (list p)))
	  (if (< (car p3) (car p4)) 
		(setq listDD (append listDD (list p3)))
		(setq listDD (append listDD (list p4)))
	  )
	))
	(setq i (1+ i))
  )
))
 ))
;Ket qua listDD chua ds diem dau va listDG chua danh sach diem giao
)

  • 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

Đúng chính xác là đoạn code em cần.

Nhưng nó có lỗi error: too many arguments

Em ko biết nó lỗi ở chỗ nào, fiền anh xem lại giúp em với.

Tiện đây anh có thể giải thích hộ em đoạn này không?

(ssget "f" (list p1 p2) '((0 . "line")))

Và nếu em muốn nhận đối tượng gồm cả line và polyline thì làm thế nào? em đã đọc help nhưng không hiểu đoạn này lắm.

cảm ơn anh 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
Đúng chính xác là đoạn code em cần.

Nhưng nó có lỗi error: too many arguments

Em ko biết nó lỗi ở chỗ nào, fiền anh xem lại giúp em với.

Tiện đây anh có thể giải thích hộ em đoạn này không?

(ssget "f" (list p1 p2) '((0 . "line")))

Và nếu em muốn nhận đối tượng gồm cả line và polyline thì làm thế nào? em đã đọc help nhưng không hiểu đoạn này lắm.

cảm ơn anh nhiều.

Mình đã down lại file trên mạng và file ở máy nhà, cả 2 đều chạy tốt cả trên cad2002 và cad2008. Lỗi trên có lẽ do đụng hàm cùng tên trên máy của bạn. Đoạn lisp trên chỉ toàn sử dụng kiến thức của Autolisp chứ kg có Visual lisp nên cũng khá đơn giản. Bạn có thể tìm đc vị trí lỗi dễ dàng bằng kinh nghiệm của bạn.

(ssget "f" (list p1 p2) '((0 . "line")))

Đoạn code này cho phép chọn đối tượng đi qua một đường thẳng hoặc đường gấp khúc định bởi danh sách các tọa độ p1 p2 ... (vị trí cắt nhau phải liền nét). Bạn có thể chọn thêm các đối tượng khác. Ví dụ : (ssget "f" (list p1 p2) '((0 . "line,lwpolyline")))

Trên diễn đàn đã có nhiều bài viết về xác định giao của hai đối tượng rất hay bằng Visual Lisp. Bạn có thể tham khảo để xây dựng code tổng quát hơn

  • 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
Tiện đây anh có thể giải thích hộ em đoạn này không?

(ssget "f" (list p1 p2) '((0 . "line")))

Và nếu em muốn nhận đối tượng gồm cả line và polyline thì làm thế nào? em đã đọc help nhưng không hiểu đoạn này lắm.

cảm ơn anh nhiều.

Bạn có thể sử dụng như thế này : (ssget "f" (list p1 p2) '((0 . "*line")))

Nó chọn Line, Polyline, LWpolyline

*line : thì * là kí tự đại diện, còn line là đuôi đằng sau. Miễn là đối tượng nào có đuôi line đằng sau là Lisp chọn tất bao gồm cả Splỉne

  • 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 có thể sử dụng như thế này : (ssget "f" (list p1 p2) '((0 . "*line")))

Nó chọn Line, Polyline, LWpolyline

*line : thì * là kí tự đại diện, còn line là đuôi đằng sau. Miễn là đối tượng nào có đuôi line đằng sau là Lisp chọn tất bao gồm cả Splỉne

Cái này đúng là hay quá. thank anh nhiều :s_big:

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
Đăng nhập để thực hiện theo  

×