Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
5 replies to this topic

#1 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 04 September 2009 - 06:36 PM

Hình đã gửi
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ỏ)
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#2 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 04 September 2009 - 11:39 PM

Hình đã gửi
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
)

  • 2

#3 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 September 2009 - 01:34 AM

Đú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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#4 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 05 September 2009 - 03:55 AM

Đú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
  • 2

#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 05 September 2009 - 08:00 AM

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

#6 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 September 2009 - 11:30 AM

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:
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD