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

[Yêu cầu] Cắt đường thẳng tại điểm giao

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

trên diễn đàn mình có thấy có một lisp Break tại một điểm....lisp như sau:

 

(defun c:bf (/ dt diem)


(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
)

 

 

 

Các bạn có thể nâng cấp nó lên theo chế độ click điểm cần cắt liên tục không, chứ mỗi lần lại gõ lệnh lại hơi phiền ...

Và nếu được thì nâng cấp thêm là thay vì cắt tại điểm click thì cắt tại điểm giao nhau:

1) ta chọn đối tượng cần chặt điểm có chế độ chọn nhiều đối tượng cùng lúc(gọi là đối tượng 1)

2) chọn đối tượng giao với nó chú ý là có chế độ chọn nhiều đường cùng lúc nha (đối tượng 2)

3) lệnh sẽ chặt đối tượng 1 được chọn tại những diểm giao với đố tượng 2 và đồng thời nó sẽ hỏi là đối tượng 2 có bị chặt điểm tại điểm giao luôn không (yes/no)

 

1111.jpg

mình có cái lisp này nhưng nó lại không cho chọn liên tục, và ko có chế độ thứ 3

(defun c:Boj ()


  	(setq ent1 (car (setq ent (entsel "\nVao doi tuong can cat: "))))
 	(redraw ent1 3)
 	(setq ent2 (car (entsel "\nVao doi tuong dung de cat: ")))
 	(redraw ent1 4)
 	(setq giao (giaodt ent1 ent2))
 	(if giao
   		(foreach pp	giao
  				(command "break" ent "f" pp "@")
   		)
 		(alert "2 doi tuong khong giao nhau!")
 	)
 	(princ)
)
(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
   	)
)

 

 

Bác nào có thể viết zùm cái lisp đó nhé (nếu kết hợp luôn cả chặt điểm tại click luon thi cang tot)

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

trên diễn đàn mình có thấy có một lisp Break tại một điểm....lisp như sau:

 

(defun c:bf (/ dt diem)

(setq dt (car (entsel "\nVao doi tuong can chat")))

(if dt

(progn

(redraw dt 3)

(setq diem (getpoint "\nVao diem chat: "))

(redraw dt 4)

)

)

(if (and dt diem)

(command ".break" dt diem diem)

)

)

 

 

Các bạn có thể nâng cấp nó lên theo chế độ click điểm cần cắt liên tục không, chứ mỗi lần lại gõ lệnh lại hơi phiền ...

Và nếu được thì nâng cấp thêm là thay vì cắt tại điểm click thì cắt tại điểm giao nhau:

1) ta chọn đối tượng cần chặt điểm có chế độ chọn nhiều đối tượng cùng lúc(gọi là đối tượng 1)

2) chọn đối tượng giao với nó chú ý là có chế độ chọn nhiều đường cùng lúc nha (đối tượng 2)

3) lệnh sẽ chặt đối tượng 1 được chọn tại những diểm giao với đố tượng 2 và đồng thời nó sẽ hỏi là đối tượng 2 có bị chặt điểm tại điểm giao luôn không (yes/no)

mình có cái lisp này nhưng nó lại không cho chọn liên tục, và ko có chế độ thứ 3

(defun c:Boj ()

(setq ent1 (car (setq ent (entsel "\nVao doi tuong can cat: "))))

(redraw ent1 3)

(setq ent2 (car (entsel "\nVao doi tuong dung de cat: ")))

(redraw ent1 4)

(setq giao (giaodt ent1 ent2))

(if giao

(foreach pp giao

(command "break" ent "f" pp "@")

)

(alert "2 doi tuong khong giao nhau!")

)

(princ)

)

(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

)

)

 

Bác nào có thể viết zùm cái lisp đó nhé (nếu kết hợp luôn cả chặt điểm tại click luon thi cang tot)

Đây! Mình nhặt được trên mạng, có bổ sung chút xíu. Hy vọng bạn hài lòng

http://www.cadviet.com/upfiles/3/cat_doi_tuong.zip

  • 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

Thư viện break all này đã được giới thiệu trên Cadviet khá lâu rồi còn j :)

Xin hỏi chủ topic đã tìm kiếm chưa ? Đã bít cách dùng chức năng <code> không ? Có thấy khó chịu khi đọc lại bài post của mình với 1 đống chữ to tướng không ? Và đã phân biệt thế nào là đối tượng và nhóm đối tượng chưa.hề

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 về lisp breakall này...còn cái lisp chặt điểm có ai nâng cấp nó thành multil click không...

(defun c:bf (/ dt diem)

(setq dt (car (entsel "\nVao doi tuong can chat")))

(if dt

(progn

(redraw dt 3)

(setq diem (getpoint "\nVao diem chat: "))

(redraw dt 4)

)

)

(if (and dt diem)

(command ".break" dt diem diem)

)

)

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êm vòng while vào nt :

(Vì bạn k nói click cái j multi , tốt nhất là xác định lại đối tượng bị chặt ^^)

 

(defun c:bf (/ dt diem)
(while
(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
);end while
) 

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 về lisp breakall này...còn cái lisp chặt điểm có ai nâng cấp nó thành multil click không...

(defun c:bf (/ dt diem)

(setq dt (car (entsel "\nVao doi tuong can chat")))

(if dt

(progn

(redraw dt 3)

(setq diem (getpoint "\nVao diem chat: "))

(redraw dt 4)

)

)

(if (and dt diem)

(command ".break" dt diem diem)

)

)

Phải thế này không ?

(defun c:bf (/ dt diem)
 (if (setq dt (car (entsel "\nChon doi tuong can chat")))
   (progn
     (redraw dt 3)
     (while (setq diem (getpoint "\nChon diem chat: "))
(command ".break" dt diem diem)
(redraw dt 3))
     (redraw dt 4))))

  • 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ác Bach chưa test naz ^^ Chặt ra thành 2 thằng rồi thì còn thằng dt nữa đâu ạ ^^ E định lấy entlast nhưng mà nó lại khù khoằm hơn, tốt nhất cứ để chọn lại, vừa chuẩn mà cũng k lâu hơn mấy

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

Phải thế này không ?

(defun c:bf (/ dt diem)
 (if (setq dt (car (entsel "\nChon doi tuong can chat")))
   (progn
     (redraw dt 3)
     (while (setq diem (getpoint "\nChon diem chat: "))
(command ".break" dt diem diem)
(redraw dt 3))
     (redraw dt 4))))

của giabach nếu thêm được việc chọn đối tượng can chat là Multil thì hay

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ác Bach chưa test naz ^^ Chặt ra thành 2 thằng rồi thì còn thằng dt nữa đâu ạ ^^ E định lấy entlast nhưng mà nó lại khù khoằm hơn, tốt nhất cứ để chọn lại, vừa chuẩn mà cũng k lâu hơn mấy

Còn đó chứ chạy đi đâu đuợc.

Có điều nó có còn là thằng mình muốn "chặt" nữa không thôi?! (xác xuất 50-50)

Nếu không phải thì enter : chọn lại.

 

của giabach nếu thêm được việc chọn đối tượng can chat là Multil thì hay

Đã có thằng "Break All" lo chuyện này rù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

Còn đó chứ chạy đi đâu đuợc.

Có điều nó có còn là thằng mình muốn "chặt" nữa không thôi?! (xác xuất 50-50)

Nếu không phải thì enter : chọn lại.

 

 

Đã có thằng "Break All" lo chuyện này rùi.

breakall thì chặt theo đối tượng giao, mình muốn chặt break tại điểm bất kì mah, giabach co the them cai lua chon doi tuong bi break la multil ko...cam on

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òn đó chứ chạy đi đâu đuợc.

Có điều nó có còn là thằng mình muốn "chặt" nữa không thôi?! (xác xuất 50-50)

Nếu không phải thì enter : chọn lại.

 

 

Hề hề, lúc đó nó đã bị xử thành 1nửa cuối thằng đầu rồi, và đúng là xác xuất 50 - 50, thế nên ở cái đầu e để chọn lại liên tiếp ^^

 

breakall thì chặt theo đối tượng giao, mình muốn chặt break tại điểm bất kì mah, giabach co the them cai lua chon doi tuong bi break la multil ko...cam on

Bạn đã tính đến việc lisp xử lý ntn khi bạn chọn nhiều đối tượng, sau đó quay lại chọn điểm, thì lisp sẽ làm cách nào để xác định điểm đó thuộc đối tượng nào trong đống đối tượng trước đó bạn chọn không ?? Nhất là trường hợp điểm đó lại là giao của 2/nhiều đối tượng, break theo thằng nào ??

Vẫn biết là lisp giúp xử lý công việc nhanh, nhưng mình nghĩ bạn cũng đừng quá lạm dụng request mà đến mức Lãn Ông quá.. Liệu có quá lâu nếu thêm 1 dấu cách sau khi đã kick nhiều điểm chặt ?

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ề hề, lúc đó nó đã bị xử thành 1nửa cuối thằng đầu rồi, và đúng là xác xuất 50 - 50, thế nên ở cái đầu e để chọn lại liên tiếp ^^

 

 

Bạn đã tính đến việc lisp xử lý ntn khi bạn chọn nhiều đối tượng, sau đó quay lại chọn điểm, thì lisp sẽ làm cách nào để xác định điểm đó thuộc đối tượng nào trong đống đối tượng trước đó bạn chọn không ?? Nhất là trường hợp điểm đó lại là giao của 2/nhiều đối tượng, break theo thằng nào ??

Vẫn biết là lisp giúp xử lý công việc nhanh, nhưng mình nghĩ bạn cũng đừng quá lạm dụng request mà đến mức Lãn Ông quá.. Liệu có quá lâu nếu thêm 1 dấu cách sau khi đã kick nhiều điểm chặt ?

Bạn két xù...thì mình click tại điểm nằm trên đối tượng nào thì chỗ đó sẽ break thôi, chứ nếu điểm đó không nằm trên đối tượng đó thì làm sao break hả bạn...Nếu là điểm giao hay nhiều đối tượng thì nếu là nằm trên đối tượng chọn thì nó break hết...ví dụ 3 đường giao nhau tai A...ta chỉ chọn 2 đường, thì break chỉ trên hai đường tại A thôi...

Lisp gia bach sau khi break thi no se loai di doi mot doi tuong duoc tach ra, va chi con lai doi tuong duoc chon theo diem dau cuoi cua doi tuong...co cach nao la sau khi break thi che do select van la nhu ban dau khong ban, tuc luc break mot diem thi se co hai doi tuong nhung hai doi tuong do van dang duoc lua chon chu khong bi loai di mot trong hai, va cu nhu the

  • 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

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  

×