Đến nội dung


Hình ảnh
- - - - -

Giúp Tìm Giao Điểm Polyline


  • Please log in to reply
14 replies to this topic

#1 doanduyhung

doanduyhung

    biết vẽ spline

  • Members
  • PipPip
  • 90 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 11 September 2007 - 09:34 AM

Bạn nào có lisp tự tạo nhiều giao điểm trên polyline (các điểm phân đoạn của 1 polyline), khi cho 1 đoạn polyline cắt qua các đường thẳng line-tròn-vuông bật kì ko?

Bài viết đã được chỉnh sửa nội dung bởi interwar1283: 11 September 2007 - 12:06 PM

  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 11 September 2007 - 10:39 AM

Bạn nào có lisp tự tạo nhiều giao điểm trên polyline (các điểm phân đoạn của 1 polyline), khi cho 1 đoạn polyline cắt qua các đường thẳng line-tròn-vuông bật kì ko?

Lệnh GIAO dưới đây sẽ vẽ các điểm point vào giao điểm của 2 đối tượng.


(defun c:giao ()
(defun GiaoDT (ent1 ent2)
(setq ob1 (vlax-ename->vla-object ent1)
ob2 (vlax-ename->vla-object ent2)
)
(setq g (vlax-variant-value
(vla-IntersectWith ob1 ob2 acExtendNone)
)
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
(setq g (vlax-safearray->list g))
(setq g nil)
)
(if g
(progn
(setq kq nil
sd (fix (/ (length g) 3))
)
(repeat sd
(setq kq (append kq (list (list (car g) (cadr g) (caddr g))))
g (cdddr g)
)
)
kq
)
nil
)
)
(setq ent1 (car (entsel "\nVao dt1: ")))
(redraw ent1 3)
(setq ent2 (car (entsel "\nVao dt2: ")))
(redraw ent1 4)
(setq giao (giaodt ent1 ent2))
(if giao
(foreach pp giao
(entmake (list (cons 0 "POINT") (cons 10 pp)))
)
(alert "2 doi tuong khong giao nhau!")
)
(princ)
)

  • 0

#3 interwar1283

interwar1283

    biết dimcontinue

  • Vip
  • PipPipPipPipPip
  • 374 Bài viết
Điểm đánh giá: 211 (khá)

Đã gửi 11 September 2007 - 10:43 AM

Bạn nào có lisp tự tạo nhiều giao điểm trên polyline (các điểm phân đoạn của 1 polyline), khi cho 1 đoạn polyline cắt qua các đường thẳng line-tròn-vuông bật kì ko?

Ý của bạn mình kô rõ lắm, khi polyline cắt qua line-tròn-vuông bất kỳ thì đã tồn tại giao điểm giữa chúng vậy việc tạo ra chúng để làm gì, bạn nói cụ thể hơn công việc tiếp sau khi bạn đã có giao điểm đó như vậy rễ hình dung hơn.
  • 0

#4 doanduyhung

doanduyhung

    biết vẽ spline

  • Members
  • PipPip
  • 90 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 11 September 2007 - 11:08 AM

Ý của bạn mình kô rõ lắm, khi polyline cắt qua line-tròn-vuông bất kỳ thì đã tồn tại giao điểm giữa chúng vậy việc tạo ra chúng để làm gì, bạn nói cụ thể hơn công việc tiếp sau khi bạn đã có giao điểm đó như vậy rễ hình dung hơn.

Khi mình vẽ 1 polyline qua 2 điểm thì chỉ có 1 phân đọan thôi.
Mà polyline này cắt qua 2 đường thẳng bất kì.
Khi đó mình chọn polyline nó sẽ tự động phân thành 3 phân đoạn với 4 điểm được tạo ra trên polyline ban đầu ( đả thêm được 2 điểm giao tại vị trí các đường line cắt qua)
  • 0

#5 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 18 November 2010 - 03:36 PM

Lệnh GIAO dưới đây sẽ vẽ các điểm point vào giao điểm của 2 đối tượng.


(defun c:giao ()
(defun GiaoDT (ent1 ent2)
(setq ob1 (vlax-ename->vla-object ent1)
ob2 (vlax-ename->vla-object ent2)
)
(setq g (vlax-variant-value
(vla-IntersectWith ob1 ob2 acExtendNone)
)
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
(setq g (vlax-safearray->list g))
(setq g nil)
)
(if g
(progn
(setq kq nil
sd (fix (/ (length g) 3))
)
(repeat sd
(setq kq (append kq (list (list (car g) (cadr g) (caddr g))))
g (cdddr g)
)
)
kq
)
nil
)
)
(setq ent1 (car (entsel "\nVao dt1: ")))
(redraw ent1 3)
(setq ent2 (car (entsel "\nVao dt2: ")))
(redraw ent1 4)
(setq giao (giaodt ent1 ent2))
(if giao
(foreach pp giao
(entmake (list (cons 0 "POINT") (cons 10 pp)))
)
(alert "2 doi tuong khong giao nhau!")
)
(princ)
)


Nhờ Bác 'Nguyen Hoanh và các bạn sửa giúp mình lisp này một chút;
khi gõ lệnh lisp sẽ tự tìm tất cả các giao điểm và đánh dấu point vào đó
(Cụ thể là tìm các đoạn giao của 2 layer)
Cám ơn rất nhiều !
  • 0

#6 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 November 2010 - 08:38 AM

Các cao thủ giúp mình sửa lisp này với !
  • 0

#7 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 19 November 2010 - 09:10 AM

Nhờ Bác 'Nguyen Hoanh và các bạn sửa giúp mình lisp này một chút;
khi gõ lệnh lisp sẽ tự tìm tất cả các giao điểm và đánh dấu point vào đó
(Cụ thể là tìm các đoạn giao của 2 layer)
Cám ơn rất nhiều !

LISP chèn POINT tại tất cả giao điểm của tập chọn (*LINE,ARC,CIRCLE,ELLIPSE)

link Viết lisp theo yêu cầu - bài 2209
  • 1

#8 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 November 2010 - 12:00 PM

LISP chèn POINT tại tất cả giao điểm của tập chọn (*LINE,ARC,CIRCLE,ELLIPSE)

link Viết lisp theo yêu cầu - bài 2209

Mình sài cái lisp đó không được ! Mình thấy lisp trên đã tương đối rồi lên nhờ bạn chỉnh lại thành chạy cho layer chứ không phải đối tượng ..
Giúp mình nhé !
  • 0

#9 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 November 2010 - 01:49 PM

Do đặc thù công việc là thế mình không biết lisp .Có thể bạn chưa hiểu hết ý mình ... Lisp trên chỉ tìm giao của 2 đoạn thẳng muốn tìm tiếp phải chọn tiếp lần nữa .nhưng mình muốn nó tìm hết các chỗ giao của 2 layer đó.
Bạn xem hình giúp mình nhé :
Hình đã gửi
  • 0

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 November 2010 - 02:24 PM

Do đặc thù công việc là thế mình không biết lisp .Có thể bạn chưa hiểu hết ý mình ... Lisp trên chỉ tìm giao của 2 đoạn thẳng muốn tìm tiếp phải chọn tiếp lần nữa .nhưng mình muốn nó tìm hết các chỗ giao của 2 layer đó.
Bạn xem hình giúp mình nhé :
Hình đã gửi

Bạn thử code này nhé :
Sau khi pick chọn 1 đối tượng mẫu thuộc layer thứ nhất và pick chọn 1 đối tượng mẫu thuộc layer thứ 2
-> Chọn đối tượng cần tìm giao điểm và Lisp sẽ làm việc mà bạn muốn
Đây là code "kế thừa" code của anh gia_bach
http://www.cadviet.c.../3/giaodiem.lsp
  • 1

#11 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 November 2010 - 10:21 AM

Bạn thử code này nhé :
Sau khi pick chọn 1 đối tượng mẫu thuộc layer thứ nhất và pick chọn 1 đối tượng mẫu thuộc layer thứ 2
-> Chọn đối tượng cần tìm giao điểm và Lisp sẽ làm việc mà bạn muốn
Đây là code "kế thừa" code của anh gia_bach
http://www.cadviet.c.../3/giaodiem.lsp


Mình chạy lisp báo :
Select objects:
error: null function
(ACET-SS-TO-LIST SS)
Bạn Tue_NV giúp mình xem lỗi gì nhé
cám ơn bạn !
  • 0

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 November 2010 - 10:47 AM

Mình chạy lisp báo :
Select objects:
error: null function
(ACET-SS-TO-LIST SS)
Bạn Tue_NV giúp mình xem lỗi gì nhé
cám ơn bạn !

Máy của bạn phải cài phụ trợ Express mới sử dụng code trên
Nếu không sử dụng phụ trợ Express, bạn sử dụng thử cái này :
http://s.cadviet.com/7v
  • 1

#13 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 November 2010 - 11:16 AM

Máy của bạn phải cài phụ trợ Express mới sử dụng code trên
Nếu không sử dụng phụ trợ Express, bạn sử dụng thử cái này :
http://s.cadviet.com/7v

Mình chạy nó không báo lỗi nữa nhưng nó chỉ tìm được 2 giao điểm đầu tiên ..Tue_NV thử test trên file này giúp mình nhé

Attach: http://www.cadviet.c...3/check_loi.dwg
  • 0

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 November 2010 - 11:39 AM

Mình chạy nó không báo lỗi nữa nhưng nó chỉ tìm được 2 giao điểm đầu tiên ..Tue_NV thử test trên file này giúp mình nhé

Attach: http://www.cadviet.c...3/check_loi.dwg

File check không có lỗi gì cả.
File đã check : http://s.cadviet.com/zv
Bạn làm theo các bước sau :

......
Sau khi pick chọn 1 đối tượng mẫu thuộc layer thứ nhất và pick chọn 1 đối tượng mẫu thuộc layer thứ 2
-> Chọn các đối tượng cần tìm giao điểm và Lisp sẽ làm việc mà bạn muốn
.....


  • 0

#15 m.rduong

m.rduong

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 November 2010 - 01:17 PM

File check không có lỗi gì cả.
File đã check : http://s.cadviet.com/zv
Bạn làm theo các bước sau :


Sorry ! Lisp của Tue_NV chạy tốt rồi


Làm phiền bạn Bạn cho mình hỏi thêm một chút nhé ..Tại sao mình chạy trên Autocad thì tốt mà chạy trên *** nó lại chỉ tìm được có một giao điểm đầu tiên nhỉ :(bên mình dùng ***) ko biết có hỗ trợ không một số lisp vẫn chạy được một số lại lỗi

Chạy trên *** gõ lệnh xong nó tìm được một giao điểm sau đó lại bắt Select objects:
Select objects:
Opposite corner:Find out 10, total 10
Select objects:
  • 0