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

[Yêu cầu] Vẽ đường thẳng nối 2 polyline

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

Mình có bài toán này cần nhờ xem ai giúp được thì xử lý giúp

Có 2 polyline A,B

Yêu cầu là: vẽ đường thẳng có chiều dài là a nằm giữa 2 polyine này

Mô tả thuật toán:

Đường line cần vẽ có chiều dài a, bắt đầu cho đường line chạy trên Poly A, di chuyển đến khi nào gặp điểm trên Poly B thì dừng lại

quá trình tiếp tục đến hết chiều dài của 2 polyine

Mặc dù nắm được thuật toán nhưng kiến thức lisp hạn chế

Mòng các bác giúp

Trân trọng !48467_bv.png

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ó phải như vầy không?

 

(defun c:tes(/ D2 EL GD LEN SS V1 V2)
(defun ints (o1 o2 mo)
(defun get3(l) (if (cdddr l) (cons (list (car l) (cadr l) (caddr l)) (get3 (cdddr l))) (list l)))
 (get3 (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) mo))
)
;;;
(princ "\nChon 2 polyline:")
(setq ss (ssget '((0 . "LWPOLYLINE")))
len (getreal (strcat "\nChieu dai duong thang noi 2 pline <" (if gl_len (rtos gl_len) (rtos (setq gl_len 1))) ">:"))) 
(if len (setq gl_len len))
 
(if (= 2 (sslength ss))
(setq v1 (ssname ss 0)
v2 (ssname ss 1)
d2 (cdr (assoc 10 (entget v2)))
))
(command ".offset" gl_len v1 d2 "" )
(setq el (entlast)
gd (ints el v2 acextendnone))
(if (car gd)
(foreach d gd
(entmake (list '(0 . "LINE") (cons 10 d) (cons 11 (vlax-curve-getclosestpointto v1 d))))))
(entdel el)
(princ)
)
  • 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.

Mình kiem tra thử thấy về thuật toán cơ bản là ok. Nhưng để chính xác lại thì như này:

Ví dụ cần vẽ đường line (A) có độ dài là 1. Thì cái điểm đầu của A nó nằm trên PL1 và điểm cuối của A nằm trên PL2 nhưng bản chất thì góc hợp bởi đường A và phương ngang là 90 độ. Chứ lisp hiện tại thì góc đường A và phương ngang khác 90 độ hay nói cách khác đường A không song song phương đứng

Nghĩa là đường A là đường có điểm đầu và cuối trùng hoành độ X

Mong bác kiểm tra giúp

Trân trọ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

Như vậy, thuật toán có thể chỉ là:

- Copy PL1 theo phương đứng & khoảng dời là A về 2 phia

- Xác định các điểm giao của PL2 với 2 "ảnh của PL1"

- Vẽ line

  • 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

Vậy thì đây.

 

(defun c:tes(/ D2 EL1 EL2 GD1 GD2 LEN SS V1 V2)
(defun ints (o1 o2 mo)
(defun get3(l) (if (cdddr l) (cons (list (car l) (cadr l) (caddr l)) (get3 (cdddr l))) (list l)))
 (get3 (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) mo))
)
(defun giao (gd k) 
(foreach d gd
(entmake (list '(0 . "LINE") (cons 10 d) (cons 11 (polar d (* k pi) gl_len)))))
)
;;;
(princ "\nChon 2 polyline:")
(setq ss (ssget '((0 . "LWPOLYLINE")))
len (getreal (strcat "\nChieu dai duong thang noi 2 pline <" (if gl_len (rtos gl_len) (rtos (setq gl_len 1))) ">:"))) 
(if len (setq gl_len len))
 
(if (= 2 (sslength ss))
(setq v1 (ssname ss 0)
v2 (ssname ss 1)
d2 (cdr (assoc 10 (entget v2)))
))
(command ".copy" v2 "" d2 (polar d2 (* 0.5 pi) gl_len)  "" ) (setq el1 (entlast))
(command ".copy" v2 "" d2 (polar d2 (* -0.5 pi) gl_len)  "" ) (setq el2 (entlast))
(setq gd1 (ints el1 v1 acextendnone)
gd2 (ints el2 v1 acextendnone))
(if (car gd1) (giao gd1 -0.5))
(if (car gd2) (giao gd2 0.5))
(entdel el1) (entdel el2)
(princ)
)
  • 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 rất nhiều. Thuật toán về cơ bản lisp đã thực hiện rất rất oke.

Tuy nhiên, cũng rất mong khi bác có thời gian có thể hoàn thiện nốt yêu cầu với một bài toán mở rộng hơn. Cụ thể:

1.Trên bản vẽ có n cặp đối tượng pline A-B như trên thuộc 2 lớp khác nhau => Khi thực hiện chỉ cần quét toàn

bộ trên bản vẽ.

2.Chiều dài đường nối pline A-B có m loại: 1,2,3

=> Khi nhập vào lisp hỏi nhập các đoạn cần vẽ: 1,2,3

Chuyển layer tương ứng cho các loại này

3. Mở rộng cho trường hợp đối tượng A-B là polyline

(thuật toán đang xét cho LWPL)

Trân trọ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

Đang bận nên ko code đc mà chỉ "ném đá" :D :D :D

@NgocSon:

- Dấu hiệu nào để nhận biết 2 đối tượng là 1 cặp của nhau ???

- Giã sử đã "bắt cặp" được thì làm sao để Cad hiểu cặp nào thì vẽ line với chiều dài 1,2 hay 3 ???

 

p/s: code ở #5 của bác Tot77 đã ko kiểm soát biến OSMODE >>> có thể lỗi tại hàm command copy

  • 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

Đang bận nên ko code đc mà chỉ "ném đá" :D :D :D

@NgocSon:

- Dấu hiệu nào để nhận biết 2 đối tượng là 1 cặp của nhau ???

- Giã sử đã "bắt cặp" được thì làm sao để Cad hiểu cặp nào thì vẽ line với chiều dài 1,2 hay 3 ???

48467_bv_1.png

Các đối tượng thuôc PL1 thuộc 1  layer, PL2 cũng vậy

Cặp được hiểu như sau: Với mỗi đối tượng thuộc PL1 thì sẽ lấy PL2 gần PL1  nhất (nghĩa là khoảng cách theo phương đứng là nhỏ nhất) và đk về tọa độ là Ymin(PL1)>Ymax(PL2)

Sau khi thỏa mãn đk trên nghĩa là đá cặp được với nhau rồi => Vẽ thôi :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

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  

×