Chuyển đến nội dung
Diễn đàn CADViet
nguyentam0920

Cần tìm Lisp chèn block tại các điểm giao nhau(intersection)

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

Chào các bác...!

Em là thành viên mới..!

Có những lúc chúng ta cần chèn 1 loại block vào những điểm giao nhau(intersection),nếu những điểm giao nhau đó nhiều lên đến hàng trăm,hàng ngàn mà lại không thể dùng lệnh array được thì copy mất khá nhiều thời gian.Em đang nghĩ đến 1 lisp có thể hỗ trợ công việc này.

Hiện tại em đang tìm lisp có chức năng dạng này.Bác nào biết thì chỉ em với!Xin cảm ơn nhiều...Em chưa biết gì về autolisp nên không tự viết được.Chỉ có ý tưởng thế thôi.

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
Chào các bác...!

Em là thành viên mới..!

Có những lúc chúng ta cần chèn 1 loại block vào những điểm giao nhau(intersection),nếu những điểm giao nhau đó nhiều lên đến hàng trăm,hàng ngàn mà lại không thể dùng lệnh array được thì copy mất khá nhiều thời gian.Em đang nghĩ đến 1 lisp có thể hỗ trợ công việc này.

Hiện tại em đang tìm lisp có chức năng dạng này.Bác nào biết thì chỉ em với!Xin cảm ơn nhiều...Em chưa biết gì về autolisp nên không tự viết được.Chỉ có ý tưởng thế thôi.

Hôm trước thấy bác ssg có cái lisp break đối tượng tại các điểm giao nhau. Mình tin rằng bác ấy có thể giúp bạn nhưng mình nghỉ bạn nên nói rỏ ra 1 tí:

-Cái block bạn muốn chèn là như thế nào? cố định sẳn có (bạn phải upcái này lên hoặc cung cấp tên)

-Hay là bạn muốn chỉ định block bằngcách nhập tên hoặc chon trực tiếp trên bản vẻ.

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ìm mãi rồi cũng thấy có chỗ nói về giao đối tượng:

http://www.cadviet.com/forum/index.php?showtopic=1535

 

Lấy đoạn code mà bác Ssg và bác Hoành hướng dẫn ở đó, mô đi phê 1 chút là có ngay cái bạn cần.

 

Lisp ChenGiao dưới đây sẽ chèn các block vào giao điểm các đối tượng.

(defun c:ChenGiao ()

(setq TapChon (ssget)

TenBlock (getstring "\nNhap ten block: ")

)

(if (tblsearch "block" TenBlock)

(progn

(setq SoDoiTuong

(sslength TapChon)

cs1 0

)

(repeat SoDoiTuong

(setq DoiTuong1 (ssname TapChon cs1)

cs2 (+ cs1 1)

)

(repeat (- SoDoiTuong cs1 1)

(setq DoiTuong2 (ssname TapChon cs2)

TapGiaoDiem (GiaoDT DoiTuong1 DoiTuong2)

cs2 (+ cs2 1)

)

(foreach Diem TapGiaoDiem

(entmake

(list (cons 0 "insert") (cons 2 TenBlock) (cons 10 Diem))

)

)

)

(setq cs1 (+ cs1 1))

)

)

(princ "Khong co ten block")

)

)

 

 

(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

)

)

  • 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
Hôm trước thấy bác ssg có cái lisp break đối tượng tại các điểm giao nhau. Mình tin rằng bác ấy có thể giúp bạn nhưng mình nghỉ bạn nên nói rỏ ra 1 tí:

-Cái block bạn muốn chèn là như thế nào? cố định sẳn có (bạn phải upcái này lên hoặc cung cấp tên)

-Hay là bạn muốn chỉ định block bằngcách nhập tên hoặc chon trực tiếp trên bản vẻ.

 

Cảm ơn bạnđã quan tâm đến vấn đề của mình.Mình muốn chèn block bình thường thôi,có tên bất kỳ do trong lúc làm việc mình tạo ra.Ví dụ đơn giản block đó chỉ là 1 hình ngôi sao nội tiếp đường tròn,Base point là tâm đường tròn.Nếu có đoạn lisp chỉ định Block bằng cách chọn trực tiếp trên bản vẽ thì thật là tuyệt vời...!

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

Em muốn chèn block tại các giao điểm như sau:

Trong bản vẽ có 2 đường thẳng a,b giao nhau tại c (a, b khác nhau về layer)

Bây giờ em muốn chèn block có tên:"BK" tại các giao điểm c?

Cám ơn!

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 thử cái này có đúng ý bạn không

(defun LM:IntersectionsinSet ( ss / a b i j l )
 (setq i (sslength ss))
 (while (not (minusp (setq j (1- i) i (1- i))))
(setq a (vlax-ename->vla-object (ssname ss i)))
(while (not (minusp (setq j (1- j))))
 	(setq b (vlax-ename->vla-object (ssname ss j))
       	l (cons (LM:GroupByNum (vlax-invoke a 'IntersectWith b acExtendNone) 3) l)
 	)
)
 )
 (apply 'append l)
)
(defun LM:GroupByNum ( l n / r)
 (if l
(cons
 	(reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r))
 	(LM:GroupByNum l n)
)
 )
)
(defun dxf (code e) (cdr (assoc code (entget e))))
(defun C:ibi(/ os ss lst en pt item)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(princ "\n Chon cac doi tuong giao nhau")
(setq
 ss (ssget)
 lst (LM:IntersectionsinSet ss)
 en (car (entsel "\nChon Block"))
 pt (dxf 10 en)
)
(foreach item lst
 (command "copy" en "" pt item)
)
(setvar "osmode" os)
)

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

 

Bạn thử cái này có đúng ý bạn không

(defun LM:IntersectionsinSet ( ss / a b i j l )
  (setq i (sslength ss))
  (while (not (minusp (setq j (1- i) i (1- i))))
	(setq a (vlax-ename->vla-object (ssname ss i)))
	(while (not (minusp (setq j (1- j))))
  	(setq b (vlax-ename->vla-object (ssname ss j))
        	l (cons (LM:GroupByNum (vlax-invoke a 'IntersectWith b acExtendNone) 3) l)
  	)
	)
  )
  (apply 'append l)
)
(defun LM:GroupByNum ( l n / r)
  (if l
	(cons
  	(reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r))
  	(LM:GroupByNum l n)
	)
  )
)
(defun dxf (code e) (cdr (assoc code (entget e))))
(defun C:ibi(/ os ss lst en pt item)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(princ "\n Chon cac doi tuong giao nhau")
(setq
  ss (ssget)
  lst (LM:IntersectionsinSet ss)
  en (car (entsel "\nChon Block"))
  pt (dxf 10 en)
)
(foreach item lst
  (command "copy" en "" pt item)
)
(setvar "osmode" os)
)

Cái này hay quá bác ah, tks bác :D

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

Thì trước khi chạy lisp mình chuyển qua WCS, sau đó chuyển lại hệ trục khác. Viết líp đâu thể tính hết cho các trường hợp đặc biệt được.

  • 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 thử cái này có đúng ý bạn không

(defun LM:IntersectionsinSet ( ss / a b i j l )  (setq i (sslength ss))  (while (not (minusp (setq j (1- i) i (1- i))))	(setq a (vlax-ename->vla-object (ssname ss i)))	(while (not (minusp (setq j (1- j))))  	(setq b (vlax-ename->vla-object (ssname ss j))        	l (cons (LM:GroupByNum (vlax-invoke a 'IntersectWith b acExtendNone) 3) l)  	)	)  )  (apply 'append l))(defun LM:GroupByNum ( l n / r)  (if l	(cons  	(reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r))  	(LM:GroupByNum l n)	)  ))(defun dxf (code e) (cdr (assoc code (entget e))))(defun C:ibi(/ os ss lst en pt item)(setq os (getvar "osmode"))(setvar "osmode" 0)(princ "\n Chon cac doi tuong giao nhau")(setq  ss (ssget)  lst (LM:IntersectionsinSet ss)  en (car (entsel "\nChon Block"))  pt (dxf 10 en))(foreach item lst  (command "copy" en "" pt item))(setvar "osmode" os))

Bạn ơi,

Trường hợp tại nhũng điểm giao này, có điểm thì giao quay lên, có điểm thì giao quay xuống mình phải xử lý thế nào vậy bạn, hiện nay lisp này sau khi dùng có đôi chỗ giao mình phải xoay block, cảm ơn bạn.

  • Vote giảm 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 ơi,

Trường hợp tại nhũng điểm giao này, có điểm thì giao quay lên, có điểm thì giao quay xuống mình phải xử lý thế nào vậy bạn, hiện nay lisp này sau khi dùng có đôi chỗ giao mình phải xoay block, cảm ơn bạn.

Giao quay lên / Giao quay xuống là thế nào? 

Giao là giao điểm, lisp này chỉ có 1 điểm duy nhất người ta cần biết là tọa độ của điểm giao chứ cần quan tâm gì đến quay lên với quay xuống. ???

  • 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

Giao quay lên / Giao quay xuống là thế nào? 

Giao là giao điểm, lisp này chỉ có 1 điểm duy nhất người ta cần biết là tọa độ của điểm giao chứ cần quan tâm gì đến quay lên với quay xuống. ???

Chào bạn, tại điểm giao sẽ chèn block nhưng block là hình tròn hay hình vuông thi chèn tại điểm giao là giống nhau, nhưng khi block là một hình khác thì block sẽ quay theo nhiều hướng khác nhau, khi điểm giao bên trái, bên phải, bên trên, bên dưới..,cái hình minh họa thì giống như video của bạn quocmanh04tt đã thể hiện rồi đó bạn.

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

Ah, block ko đối xứng. Hì, cụ tỉ thế nào thì bạn phải đưa bản vẽ lên mọi ng mới giúp dc chứ. : )

Dear bạn, cảm ơn bạn đã quan tâm, mình ko up được bạn down theo link này vậy nhé.

 

https://drive.google.com/file/d/0BylXnbMPZLENc3hYVEZRZ0ppRzg/view?usp=sharing

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

×