Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
7 replies to this topic

#1 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 11 March 2015 - 11:33 PM

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


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 12 March 2015 - 08:50 AM

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)
)

  • 1

#3 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 12 March 2015 - 11:30 AM

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 !


  • 0

#4 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 12 March 2015 - 12:52 PM

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


  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#5 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 12 March 2015 - 01:02 PM

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)
)

  • 1

#6 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 12 March 2015 - 01:52 PM

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 !


  • 0

#7 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 14 March 2015 - 08:21 AM

Đ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


  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#8 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 14 March 2015 - 10:46 AM

Đ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 :)


  • 0