Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
16 replies to this topic

#1 nguyentam0920

nguyentam0920

    Edu level: ao5

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

Đã gửi 17 April 2008 - 11:48 AM

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

#2 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 17 April 2008 - 04:25 PM

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ẻ.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#3 crazylisp

crazylisp

    biết vẽ line

  • CADViet Team
  • PipPip
  • 20 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 23 April 2008 - 11:16 PM

Tìm mãi rồi cũng thấy có chỗ nói về giao đối tượng:
http://www.cadviet.c...?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
)
)
  • 1

#4 nguyentam0920

nguyentam0920

    Edu level: ao5

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

Đã gửi 24 April 2008 - 11:43 AM

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...!
  • 0

#5 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 2012 - 01:49 PM

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

#6 hochoaivandot

hochoaivandot

    biết dimradius

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

Đã gửi 14 March 2012 - 02:09 PM

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

  • 2

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#7 envirtech2002

envirtech2002

    biết vẽ polygon

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

Đã gửi 09 August 2013 - 11:19 AM

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


  • 0
thered

#8 trumlenmang

trumlenmang

    biết lệnh trim

  • Members
  • PipPipPip
  • 193 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 06 March 2014 - 08:34 AM

Bác hochoaivandot ơi, cái lisp bác đưa ra nó chỉ đúng ở WCS thôi. Em chuyển trục qua hệ mới nghiêng góc 45 nó sai mất rồi.


  • 0

#9 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 08 March 2014 - 12:39 PM

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.


  • 1

#10 lanvientkh

lanvientkh

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: -6 (bình thường)

Đã gửi 06 December 2016 - 04:08 PM

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.


  • -1

#11 Danh Cong

Danh Cong

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 259 Bài viết
Điểm đánh giá: 43 (tàm tạm)

Đã gửi 06 December 2016 - 05:23 PM

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. ???


  • 1

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#12 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 06 December 2016 - 06:05 PM

Nó như thế này:


  • 2

#13 lanvientkh

lanvientkh

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: -6 (bình thường)

Đã gửi 06 December 2016 - 11:37 PM

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.


  • 0

#14 Danh Cong

Danh Cong

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 259 Bài viết
Điểm đánh giá: 43 (tàm tạm)

Đã gửi Hôm qua, 05:47 AM

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ứ. : )
  • 1

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#15 lanvientkh

lanvientkh

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: -6 (bình thường)

Đã gửi Hôm qua, 09:22 AM

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...iew?usp=sharing


  • 0

#16 lanvientkh

lanvientkh

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: -6 (bình thường)

Đã gửi Hôm nay, 08:26 AM

Nó như thế này:

quá pro bạn quocmanh04tt, hihi


  • 0

#17 lanvientkh

lanvientkh

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: -6 (bình thường)

Đã gửi Hôm nay, 03:10 PM

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.

bạn Tot77 vào giúp một tay đi bạn, hihi


  • 0