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

ĐỔI CHIỀU NHIỀU POLYLINE VỀ CÙNG 1 HƯỚNG

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

Chào mọi người !

Mình đang gặp một bài toán như sau : trong bản vẽ autocad giả sử có 3 đoạn thẳng, đoạn 1 vẽ từ trái sang phải, đoạn 2 vẽ từ phải sang trái, đoạn 3 vẽ từ trái sang phải , hoặc nhiều hơn

Mình mong muốn là tất cả các đoạn thẳng sẽ được quy về cùng 1 chiều như từ trái sang phải

Mọi người có lips hoặc cách nào cho mình xin với nhé 
Cảm ơn mọi người...

  • Vote giảm 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
1 giờ trước, Kim Shin đã nói:

Chào mọi người !

Mình đang gặp một bài toán như sau : trong bản vẽ autocad giả sử có 3 đoạn thẳng, đoạn 1 vẽ từ trái sang phải, đoạn 2 vẽ từ phải sang trái, đoạn 3 vẽ từ trái sang phải , hoặc nhiều hơn

Mình mong muốn là tất cả các đoạn thẳng sẽ được quy về cùng 1 chiều như từ trái sang phải

Mọi người có lips hoặc cách nào cho mình xin với nhé 
Cảm ơn mọi người...

Lệnh RPL , hy vọng giúp ích cho bạn!

Polyline reverse (RPL).lsp

  • 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

Sửa lại lisp trên một chút cho Line, Polyline

(defun c:test ( / OBJ SS X1 X2)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun _reversepline (e /  x1 x2 x3 x4 x5 x6)
    (foreach a1	(entget e)
      (cond ((= (car a1) 10) (setq x2 (cons a1 x2)))
	    ((= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)))
	    ((= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)))
	    ((= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)))
	    ((= (car a1) 210) (setq x6 (cons a1 x6)))
	    (t (setq x1 (cons a1 x1)))
      )
    )
    (entmod (append (reverse x1)
		    (append (apply (function append)
				   (apply (function mapcar)
					  (cons	'list
						(list x2
						      (cdr (reverse (cons (car x3) (reverse x3))))
						      (cdr (reverse (cons (car x4) (reverse x4))))
						      (cdr (reverse (cons (car x5) (reverse x5))))
						) ;_  list
					  ) ;_  cons
				   ) ;_  apply
			    ) ;_  apply
			    x6
		    ) ;_  append
	    ) ;_  append
    ) ;_  entmod
    (entupd e)
);end

(defun _reverseline (e / ent sp ep)
  (setq ent (entget e)
        sp (cdr (assoc 10 ent))
        ep (cdr (assoc 11 ent))
        ent (subst (cons 10 ep) (assoc 10 ent) ent)
        ent (subst (cons 11 sp) (assoc 11 ent) ent)

        )
  (entmod ent)
  )

(defun _reverse (e)
  (if ( =  (acet-dxf 0 (entget e)) "LINE")
    (_reverseline e)
    )
  (if ( =  (acet-dxf 0 (entget e)) "LWPOLYLINE")
    (_reversepline e)
    )
  )

  (setq ss (ACET-SS-TO-LIST (ssget '((0 . "*LINE")))))
(foreach ent ss
  
(setq obj (vlax-ename->vla-object ent))
(setq x1 (car (vlax-curve-getStartPoint obj))
      x2 (car (vlax-curve-getEndPoint obj))
      )
  (if (< x2 x1)
    (_reverse ent)
    )
  )
)
     

 

  • 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

Lisp bác Cường tuy hay nhưng chưa phải dạng tổng quát, chỉ là từ trái qua, rồi có lúc nào đó thớt lại muốn từ phải qua, từ trên xuống hay từ dưới lên không lẽ lại sửa? Tốt nhất là sau khi chọn object thì pick một điểm, điểm biên nào của line gần đó sẽ là điểm đầu còn điểm còn lại sẽ là điểm cuối, lisp sẽ reverse hay không tuỳ theo đúng chiều hay không, ok?

  • 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

Bạn nói đúng với 1 entity, nhưng không đúng với selection. Bài này mình chỉ giải quyết theo ý chủ thớt.

  • 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
Vào lúc 4/5/2024 tại 16:30, limfx đã nói:

Lệnh RPL , hy vọng giúp ích cho bạn!

Polyline reverse (RPL).lsp

 

8 giờ trước, cuongtk2 đã nói:

Sửa lại lisp trên một chút cho Line, Polyline


(defun c:test ( / OBJ SS X1 X2)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun _reversepline (e /  x1 x2 x3 x4 x5 x6)
    (foreach a1	(entget e)
      (cond ((= (car a1) 10) (setq x2 (cons a1 x2)))
	    ((= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)))
	    ((= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)))
	    ((= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)))
	    ((= (car a1) 210) (setq x6 (cons a1 x6)))
	    (t (setq x1 (cons a1 x1)))
      )
    )
    (entmod (append (reverse x1)
		    (append (apply (function append)
				   (apply (function mapcar)
					  (cons	'list
						(list x2
						      (cdr (reverse (cons (car x3) (reverse x3))))
						      (cdr (reverse (cons (car x4) (reverse x4))))
						      (cdr (reverse (cons (car x5) (reverse x5))))
						) ;_  list
					  ) ;_  cons
				   ) ;_  apply
			    ) ;_  apply
			    x6
		    ) ;_  append
	    ) ;_  append
    ) ;_  entmod
    (entupd e)
);end

(defun _reverseline (e / ent sp ep)
  (setq ent (entget e)
        sp (cdr (assoc 10 ent))
        ep (cdr (assoc 11 ent))
        ent (subst (cons 10 ep) (assoc 10 ent) ent)
        ent (subst (cons 11 sp) (assoc 11 ent) ent)

        )
  (entmod ent)
  )

(defun _reverse (e)
  (if ( =  (acet-dxf 0 (entget e)) "LINE")
    (_reverseline e)
    )
  (if ( =  (acet-dxf 0 (entget e)) "LWPOLYLINE")
    (_reversepline e)
    )
  )

  (setq ss (ACET-SS-TO-LIST (ssget '((0 . "*LINE")))))
(foreach ent ss
  
(setq obj (vlax-ename->vla-object ent))
(setq x1 (car (vlax-curve-getStartPoint obj))
      x2 (car (vlax-curve-getEndPoint obj))
      )
  (if (< x2 x1)
    (_reverse ent)
    )
  )
)
     

 

Cảm ơn bác, bác có thểm giúp em thêm trường hợp từ trên xuống dưới với ạ

  • Vote giảm 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
17 giờ trước, Kim Shin đã nói:

 

Cảm ơn bác, bác có thểm giúp em thêm trường hợp từ trên xuống dưới với ạ

Có cách này bạn có thể dùng tạm, đó là quay ngược kim đồng hồ 90 độ cho nó nằm ngang, rồi dùng lisp trên, xong quay lại. Nhớ lưu điểm quay không thôi sẽ bị di chuyển. Chúc bạn làm được. Lần sau có nhờ vả thì nhớ nói luôn lúc đầu, chứ mấy lisper ngại sửa tới sửa lui lắm. Nếu có phí thì khá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
1 giờ} trướ}c, 7o7 đã nói:

Có cách này bạn có thể dùng tạm, đó là quay ngược kim đồng hồ 90 độ cho nó nằm ngang, rồi dùng lisp trên, xong quay lại. Nhớ lưu điểm quay không thôi sẽ bị di chuyển. Chúc bạn làm được. Lần sau có nhờ vả thì nhớ nói luôn lúc đầu, chứ mấy lisper ngại sửa tới sửa lui lắm. Nếu có phí thì khác.

Cảm ơn bạn 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

Trường hợp bạn chỉ dùng cho 1 đối tượng đơn lẻ, mình sẽ chỉnh sửa cho nó thành ChangeStartPoint với điểm mút gần với vị trí pick thành start point.

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

Trường hợp bạn chỉ dùng cho 1 đối tượng đơn lẻ, mình sẽ chỉnh sửa cho nó thành ChangeStartPoint với điểm mút gần với vị trí pick thành start point.

Nếu được thế cảm ơn bác nhiều lắm

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

Trường hợp bạn chỉ dùng cho 1 đối tượng đơn lẻ, mình sẽ chỉnh sửa cho nó thành ChangeStartPoint với điểm mút gần với vị trí pick thành start point.

Nếu "chỉ một đối tượng đơn lẻ" thì dùng lệnh Pedit cho nhanh.

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

Nếu "chỉ một đối tượng đơn lẻ" thì dùng lệnh Pedit cho nhanh.

Lệnh pedit cũng lằng nhằng khi bạn chưa xác định được StartPoint để nên tiến hành Reverse hay không? 

(defun c:test ( / E ENT EP OBJ PT SP)
  (while (setq ent (entsel))
    (progn
  (setq 
        e (car ent)
        pt (cadr ent)
        obj (vlax-ename->vla-object e)
        sp (vlax-curve-getStartPoint obj)
        ep (vlax-curve-getEndPoint obj))
  (if (< (distance pt ep)
         (distance pt sp))
    (command "_.Reverse" e "")
    )
  )
    )
  )

 

  • 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

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  

×