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

nối 2 đường polyline với nhau nhưng KHÔNG HỢP lại thành 1

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

24 phút trước, DuongTrungHuy đã nói:

Chào!

Hì vậy nghĩa là bạn muốn 1 lệnh như fillet nhưng đừng đính lại với nhau.

 

Vậy mình sẽ tiếp tục theo hướng đó. Nó mất công thêm 1 chút.

dạ,đúng như thế bác ạ!

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
4 giờ trước, DuongTrungHuy đã nói:

Bạn thử xem sao!

 

Chào nhé.

Cad_Viet4.LSP

dạ,em cảm ơn bác đã code lại ạ!em đã thử lại lisp của bác cũng như thử lại lisp của bác @cuongtk2 cho trường hợp 2 đường pl đơn thì kết quả là fillet được 2 đường đơn này,nhưng so với lệnh fillet thì lisp chưa fillet được trong trường hợp một đường pl và một đường line,với trong phiên bản này vẫn bị mất hết bắt điểm khi dùng lisp,việc chọn đối tượng cũng không hilight như cách chọn đối tượng ban đầu nữa bác ạ.Nhưng đó có vẻ chưa phải là vấn đề lớn nhất,em thử dùng lisp của 2 bác vào một trường hợp đường pl gấp khúc bất kì thì fillet không còn đúng nữa.Như hình dưới,nếu trong đường ABCDEF ta chọn đoạn  CD để fillet với đoạn B1C1 thì kết quả của lệnh fillet sẽ ra như hình ABCGC1D1E1,trong lúc lisp của mình lại ra kết quả các đường lại đồng quy như hình bên dưới.Như thế,tùy việc mình chọn đoạn nào trong các đường gấp khúc đó để fillet thì sẽ ra kết quả khác nhau,do đó nếu mà tìm điểm giao của 2 đối tượng sau đó break tại điểm này để tách hai đối tượng ra thì sẽ rat nhiều trường hợp phải xét đi kèm với đó là thời gian của người viết lisp sẽ mất rất nhiều.Em không biết code lisp,nhưng em nghĩ có thể nào đi theo hướng cứ cho dòng commad fillet trước,chọn đối tượng gì đó cũng để cho lênh fillet nó chọn thao tác, cho cad nó fillet thoải mái trước như thế sẽ không phải xét các trường hợp nó cắt ở đâu cho đỡ đau đầu và mất thời gian code,đợi nó fillet xong thì sẽ sinh ra một đối tượng mới.Nếu mà cad có thể ghi nhận sự thay đổi sinh ra đối tượng mới này (chính là đường ABCGC1D1E1) cùng với điểm G mới sinh ra thì ta tóm lấy đối tượng mới này và lại command break tại điểm G.Em nghĩ như thế nhưng không biết cad có làm được không và có mất nhiều thời gian của các bác không?

dung lisp.png

dung lenh fillet.png

ban dau.png

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
10 giờ trước, vanlam6408 đã nói:

dạ,em cảm ơn bác đã code lại ạ!...

Chào Bạn.

 

À trong chương trình vừa rồi mình chỉ viết để chamffer cho 2 Poly đơn thôi chứ đường gấp khúc thì phải đi tiếp nữa Bạn à.

Nó sẽ rất dài dòng mà tình huống của Bạn có vẻ hơi cá biệt sợ ít gặp trong thực tế, nên tính phổ biến của chương trình sẽ ko cao ít được người dùng.

 

Hì, Chào nhé!

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
3 giờ trước, DuongTrungHuy đã nói:

Chào Bạn.

 

À trong chương trình vừa rồi mình chỉ viết để chamffer cho 2 Poly đơn thôi chứ đường gấp khúc thì phải đi tiếp nữa Bạn à.

Nó sẽ rất dài dòng mà tình huống của Bạn có vẻ hơi cá biệt sợ ít gặp trong thực tế, nên tính phổ biến của chương trình sẽ ko cao ít được người dùng.

 

Hì, Chào nhé!

hi,cái này là em lấy bất kì 2 đường poly nên tổng quát hơn trường hợp của 2 đường poly đơn nhưng để làm được trường hợp tổng quát này em thấy nó cũng phức tạp do đó bài toán khắc xuất khắc nhập đường poly khi sử dụng lệnh fillet nếu mà đi đến cùng em nghĩ có vẻ không đơn giản

  • 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
4 giờ trước, Doan Nguyen Van đã nói:

Thế này ổn không bạn nhỉ

ezgif.com-video-to-gif.gif

ồ,hay quá!đúng rồi đó bác ạ!chưa được test thực tế nhưng trông có vẻ ổn đó bác ạ!bác làm sao mà làm được thế ạ?

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
53 phút trước, vanlam6408 đã nói:

ồ,hay quá!đúng rồi đó bác ạ!chưa được test thực tế nhưng trông có vẻ ổn đó bác ạ!bác làm sao mà làm được thế ạ?

Thuật toán là nối 2 đường xong kiểm tra vị trí các điểm của pline mới tạo ra, rồi phát nổ tại điểm nối

  • 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
38 phút trước, Doan Nguyen Van đã nói:

Thuật toán là nối 2 đường xong kiểm tra vị trí các điểm của pline mới tạo ra, rồi phát nổ tại điểm nối

hi,thuật toán đơn giản chỉ có một dòng nhưng chắc thực hiện được ý tưởng đó cũng không hề đơn giản bác nhỉ

 

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
51 phút trước, Doan Nguyen Van đã nói:

Thuật toán là nối 2 đường xong kiểm tra vị trí các điểm của pline mới tạo ra, rồi phát nổ tại điểm nối

bác có thể chia sẻ lisp này không ạ?cảm ơn bác nhiều ạ

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
(defun c:ff(/ e1 e2 p1 p2 break)
  (defun break(en / ob)
    (setq ob (vlax-ename->vla-object en)
	  p1 (vlax-curve-getparamatpoint ob
	       (vlax-curve-getclosestpointto ob (trans p1 1 0)))
	  p2 (vlax-curve-getparamatpoint ob
	       (vlax-curve-getclosestpointto ob (trans p2 1 0))))
    (If (> p1 p2) (mapcar 'set '(p1 p2) (list p2 p1)))
    (setq p1 (1+ (fix p1))
	  p2 (fix p2))
    (if (eq p1 p2)
      (command "breaK" (list en (setq p1 (vlax-curve-getpointatparam ob p1))) p1)
      (progn
	(command "breaK" (list en (setq p2 (vlax-curve-getpointatparam ob p2))) p2)
	(command "breaK" (list en (setq p1 (vlax-curve-getpointatparam ob p1))) p1))))  
    
  (if (and (mapcar 'set '(e1 p1) (entsel "Chon 1:"))
	   (mapcar 'set '(e2 p2) (entsel "Chon 2:")))
    (progn
      (command "Fillet" p1 p2)
      (if (null (entget e1)) (break e2)
	(if (null (entget e2)) (break e1)))
      (princ))))

Viết nhanh theo kiểu bác Đoàn. Làm sơ sơ nên nếu 2 đối tượng khác màu / layer nhau thì sẽ mất 1 đối tượng.

  • 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
6 giờ trước, ngokiet đã nói:

(defun c:ff(/ e1 e2 p1 p2 break)
  (defun break(en / lp n)
    (setq ob (vlax-ename->vla-object en)
	  p1 (vlax-curve-getparamatpoint ob
	       (vlax-curve-getclosestpointto ob (trans p1 1 0)))
	  p2 (vlax-curve-getparamatpoint ob
	       (vlax-curve-getclosestpointto ob (trans p2 1 0))))
    (If (> p1 p2) (mapcar 'set '(p1 p2) (list p2 p1)))
    (setq p1 (1+ (fix p1))
	  p2 (fix p2))
    (if (eq p1 p2)
      (command "breaK" (list en (setq p1 (vlax-curve-getpointatparam ob p1))) p1)
      (progn
	(command "breaK" (list en (setq p2 (vlax-curve-getpointatparam ob p2))) p2)
	(command "breaK" (list en (setq p1 (vlax-curve-getpointatparam ob p1))) p1))))  
    
  (if (and (mapcar 'set '(e1 p1) (entsel "Chon 1:"))
	   (mapcar 'set '(e2 p2) (entsel "Chon 2:")))
    (progn
      (command "Fillet" p1 p2)
      (if (null (entget e1)) (break e2)
	(if (null (entget e2)) (break e1)))
      (princ))))

Viết nhanh theo kiểu bác Đoàn. Làm sơ sơ nên nếu 2 đối tượng khác màu / layer nhau thì sẽ mất 1 đối tượng.

hìhì,em thấy về mục tiêu cốt lõi là fillet nhưng không cho 2 đối tượng nó khắc nhập vào nhau thì lisp bác viết cũng đã làm chuẩn rồi ạ,nhưng chắc bác viết vội nên chưa hilight được đối tượng được chọn như lệnh fillet,với nếu mà chọn đối tượng không chính xác sau 2 lượt lựa chọn thì sẽ game over,đây chắc là những điểm khác so với lệnh fillet gốc trong lisp bác viết.Kính chúc bác buổi tối tốt lành ạ!

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

×