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

Sắp xếp đỉnh polyline

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

Mình có một đường polyline hoặc lwpolyline.

Điểm đầu của polyline là 1. Các đỉnh còn lại 2 3 4 5 6 7.

Giờ mình muốn Cad hiểu điểm đầu là 7 các điểm tiếp theo là 6 5 4 3 2 1.

Bằng cách chọn điểm 7 thì điểm đó là điểm đầu.

Chọn điểm 1 điểm đó thành điểm đầu.

Mong các bạn chỉ dùm vấn đề hơi nan giả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

Dễ òm

Bạn lấy list điểm của polyline (cái này tìm trên cadviet) bằng cách chọn đối tượng xong

Chọn điểm bắt đầu

Dùng Hàm kiểm tra nếu điểm chọn trùng với điểm 1 thì giữ nguyên

Còn nếu điểm chọn không trùng thì xài hàm (reverse listdiem)

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
Dễ òm

Bạn lấy list điểm của polyline (cái này tìm trên cadviet) bằng cách chọn đối tượng xong

Chọn điểm bắt đầu

Dùng Hàm kiểm tra nếu điểm chọn trùng với điểm 1 thì giữ nguyên

Còn nếu điểm chọn không trùng thì xài hàm (reverse listdiem)

Không dễ chút nào bạn ạ, như mình nói khi mình chọn vào polyline thì điểm startpoint nó đã định sẵn. Mình muốn thay đổi vertex điểm đầu chứ không phải lấy dữ liệu toạ độ đỉnh. Bạn hiểu sai ý mình 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
Không dễ chút nào bạn ạ, như mình nói khi mình chọn vào polyline thì điểm startpoint nó đã định sẵn. Mình muốn thay đổi vertex điểm đầu chứ không phải lấy dữ liệu toạ độ đỉnh. Bạn hiểu sai ý mình rồi.

 

Nếu bạn có được list điểm rồi (sau khi reverse) thì bạn vẽ lại polyline vơi điểm bắt đầu là diểm chọn thôi có j đâ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

Vậy còn các điểm cong các đường arc nối vào thì sao chỉ biết toạ độ vẽ polyline thì chỉ là đường polyline chứ ko được như ban đầ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
Vậy còn các điểm cong các đường arc nối vào thì sao chỉ biết toạ độ vẽ polyline thì chỉ là đường polyline chứ ko được như ban đầu.

 

Cái này tôi gặp hoài à

Bạn có 2 cách mà bạn có thể thực hiện như sau :

Cách 1 (thủ công) :

a. move đối tượng (dt) ra 1 khoảng là 5000

b. Nổ explode đối tượng ra

c. Xoá dt chứa điểm đầu (sau khi đã đánh dấu các điểm của dt)

d. Vẽ dt theo các điểm đã đánh dấu (với điểm đầu bạn chon)

e. Xài lệnh pedit nhóm các dt với nhau (lưu ý chọn thằng dt đầu tiên sau đó mới đến dt 2, 3...)

f. Xong

Cách 2 (biết Autolisp) :

a. Chọn dt và chuyển đổi về 1 layer chưa có trong bản vẽ Ví dụ như : ACBDE j đó

b. Lấy list điểm dt

c. EXplode dt

d. Chọn diểm dt chứa điểm đầu (xác định dt là line, arc ... và lấy list điểm 1 2 3)

e. Entmake dt theo chiều ngược lại với điểm là 3 2 1

f. Pedit chọn dt vừa tạo và ssget "X" với layer ABCDE

Xong film

:(

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ái này tôi gặp hoài à

Bạn có 2 cách mà bạn có thể thực hiện như sau :

Cách 1 (thủ công) :

a. move đối tượng (dt) ra 1 khoảng là 5000

b. Nổ explode đối tượng ra

c. Xoá dt chứa điểm đầu (sau khi đã đánh dấu các điểm của dt)

d. Vẽ dt theo các điểm đã đánh dấu (với điểm đầu bạn chon)

e. Xài lệnh pedit nhóm các dt với nhau (lưu ý chọn thằng dt đầu tiên sau đó mới đến dt 2, 3...)

f. Xong

Cách 2 (biết Autolisp) :

a. Chọn dt và chuyển đổi về 1 layer chưa có trong bản vẽ Ví dụ như : ACBDE j đó

b. Lấy list điểm dt

c. EXplode dt

d. Chọn diểm dt chứa điểm đầu (xác định dt là line, arc ... và lấy list điểm 1 2 3)

e. Entmake dt theo chiều ngược lại với điểm là 3 2 1

f. Pedit chọn dt vừa tạo và ssget "X" với layer ABCDE

Xong film

:(

cách của bạn quá nhiều lệnh không cần thiết, mình chỉ cho bạn cách ngắn hơn nữa. Bạn vẽ một đường polyline với điểm đầu tuỳ ý điểm kết thúc giao với điểm bạn chọn là điểm đầu nối polyline lại với nhau và trim đường polyline thêm vào thế là đạt yêu cầu không phải di chuyển explode hay gì gì như bạn.

Mình muốn tìm 1 cách nhanh hơn và tự động thôi. Cảm ơn bạn đã cùng chia sẻ.

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ậy còn các điểm cong các đường arc nối vào thì sao chỉ biết toạ độ vẽ polyline thì chỉ là đường polyline chứ ko được như ban đầu.

căn cứ vào hệ số "Bulge" -DXF groupcode 42- để xác định độ cong của *POLYLINE

nếu bạn đã xác định được các đỉnh thì việc xác định hệ số này cũng dễ thôi

sau khi có tọa độ các đỉnh và hệ số bulge sử dụng entmake để tạo lại *POLYLINE theo ý mì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
Mình có một đường polyline hoặc lwpolyline.

Điểm đầu của polyline là 1. Các đỉnh còn lại 2 3 4 5 6 7.

Giờ mình muốn Cad hiểu điểm đầu là 7 các điểm tiếp theo là 6 5 4 3 2 1.

Bằng cách chọn điểm 7 thì điểm đó là điểm đầu.

Chọn điểm 1 điểm đó thành điểm đầu.

Mong các bạn chỉ dùm vấn đề hơi nan giải.

Nếu mục đích của bạn là để đổi chiều pline thì bạn có thể dùng lệnh reverse (cad2010 trở lên) hoặc lệnh PEdit với lựa chọn Reverse

PS: lệnh reverse còn có tác dụng cả với SPline

  • 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 dùng thử code này nhé

;|
REV.LSP © 1999-2001 Tee Square Graphics
|;

(defun C:REV (/ olderr cmde blip ltsc cclr snap pwid pgenen1 nam ent p obj ltp
			clr lts wid flgs first final next spl cur vert a clos zoomit clyr lyr)
 (setq olderr *error*)
 (defun *error* (x)
(setvar "cmdecho" cmde)
(setvar "blipmode" blip)
(setvar "osmode" snap)
(setvar "celtscale" ltsc)
(setvar "cecolor" cclr)
(setvar "plinewid" pwid)
(setvar "plinegen" pgen)
(setq *error* olderr)
(princ)
 );; end of *error* function
 (setq cmde (getvar "cmdecho")
	blip (getvar "blipmode")
	ltsc (getvar "celtscale")
	cclr (getvar "cecolor")
	snap (getvar "osmode")
	pwid (getvar "plinewid")
	clyr (getvar "clayer")
	pgen (getvar "plinegen"))
 (setvar "cmdecho" 0)
 (setvar "blipmode" 0)
 (setvar "osmode" 0)
 (setvar "plinewid" 0)
 (setvar "plinegen" 1)
 (command "_.undo" "_be")
 (while (null (setq en1 (entsel "\nPick an object to reverse: "))))
 (setq nam (car en1)
	ent (entget nam)
	p (cadr en1)
	obj (cdr (assoc 0 ent)))
 (cond
((= obj "CIRCLE")
  (setq ctr (cdr (assoc 10 ent))
		dia (* 2.0 (cdr (assoc 40 ent)))
		a (angle p ctr))
  (command "_.break" p (polar p (/ pi 4) 0.001)
		   "_.pedit" p "_y" "_c" "_x")
  (carc))
((= obj "ARC")
  (command "_.break" p "@"
		   "_.pedit" p "_y" "_j" nam (entlast) "" "_x")
  (carc))
(T nil))
 (setq ltp (cdr (assoc 6 ent))
	lyr (cdr (assoc 8 ent))
	clr (cdr (assoc 62 ent))
	lts (cdr (assoc 48 ent))
	wid (cdr (assoc 40 ent))
	flgs (cdr (assoc 70 ent)))
 (if (not ltp)(setq ltp "bylayer"))
 (cond
((= obj "LINE")
  (setq first (assoc 10 ent)
		final (assoc 11 ent)
		ent (subst (cons 10 (cdr final)) first ent)
		ent (subst (cons 11 (cdr first)) final ent))
  (entmod ent))
((= obj "LWPOLYLINE")
  (setq final (cdr (assoc 10 (setq ent (reverse ent))))
		next (cdr (assoc 10 (cdr (member (assoc 10 ent) ent)))))
  (prev))
((= obj "POLYLINE")
  (setq spl (= (logand flgs 4) 4)
		cur (= (logand flgs 2) 2)
		vert (entnext nam))
  (if cur
	(command "_.pedit" p "_s" ""))
  (while (= (cdr (assoc 0 (entget (setq vert (entnext vert))))) "VERTEX")
	(setq next final
		  final (cdr (assoc 10 (entget vert)))))
  (prev))
(T (alert "Not a REVersible object.")))
 (command "_.undo" "_e")
 (setvar "cmdecho" cmde)
 (setvar "blipmode" blip)
 (setvar "osmode" snap)
 (setvar "celtscale" ltsc)
 (setvar "cecolor" cclr)
 (setvar "plinewid" pwid)
 (setvar "plinegen" pgen)
 (setvar "clayer" clyr)
 (setq *error* olderr)
 (princ)
)
(defun carc ()
 (setq ent (entget (entlast))
	nam (cdr (assoc -1 ent))
	obj (cdr (assoc 0 ent)))
)
(defun prev ()
 (setq a (angle next final)
	clos (= (logand flgs 1) 1))
 (if clos (command "_.pedit" nam "_o" ""))
 (setq zoomit (null (ssget "c" final final)))
 (if zoomit (command "_.zoom" "_c" final ""))
 (if clr (command "_.color" clr))
 (if lts (setvar "celtscale" lts))
 (setvar "clayer" lyr)
;  (setvar "celtype" ltp)
 (command "_.pline" (polar final a 0.0001) final ""
	   "_.chprop" (entlast) "" "_lt" ltp ""
	   "_.pedit" (entlast) "_j" nam "" ""
	   "_.break" final (polar final a 0.001))
 (if cur (command "_.pedit" (entlast) "_f" ""))
 (if spl (command "_.pedit" (entlast) "_s" ""))
 (if clos (command "_.pedit" (entlast) "_c" ""))
 (if wid (command "_.pedit" (entlast) "_w" wid ""))
 (if zoomit (command "_.zoom" "_p"))
)
;;; (alert (strcat "REV.LSP © 1999-2001 Tee Square Graphics\n\n" 
;;;				"			  Type REV to begin."))
(princ)

Bác philipdn viết ghê quá đọc một hồi chưa hiểu nhưng để khi có thời gian mình được tiếp, đang bận chuẩn bị báo cáo cấp trên vẽ thủ công đã cảm ơn các bạn đã góp ý.

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 dùng thử code này nhé

;|
REV.LSP © 1999-2001 Tee Square Graphics
|;

(defun C:REV (/ olderr cmde blip ltsc cclr snap pwid pgenen1 nam ent p obj ltp
			clr lts wid flgs first final next spl cur vert a clos zoomit clyr lyr)
 (setq olderr *error*)
 (defun *error* (x)
(setvar "cmdecho" cmde)
(setvar "blipmode" blip)
(setvar "osmode" snap)
(setvar "celtscale" ltsc)
(setvar "cecolor" cclr)
(setvar "plinewid" pwid)
(setvar "plinegen" pgen)
(setq *error* olderr)
(princ)
 );; end of *error* function
 (setq cmde (getvar "cmdecho")
	blip (getvar "blipmode")
	ltsc (getvar "celtscale")
	cclr (getvar "cecolor")
	snap (getvar "osmode")
	pwid (getvar "plinewid")
	clyr (getvar "clayer")
	pgen (getvar "plinegen"))
 (setvar "cmdecho" 0)
 (setvar "blipmode" 0)
 (setvar "osmode" 0)
 (setvar "plinewid" 0)
 (setvar "plinegen" 1)
 (command "_.undo" "_be")
 (while (null (setq en1 (entsel "\nPick an object to reverse: "))))
 (setq nam (car en1)
	ent (entget nam)
	p (cadr en1)
	obj (cdr (assoc 0 ent)))
 (cond
((= obj "CIRCLE")
  (setq ctr (cdr (assoc 10 ent))
		dia (* 2.0 (cdr (assoc 40 ent)))
		a (angle p ctr))
  (command "_.break" p (polar p (/ pi 4) 0.001)
		   "_.pedit" p "_y" "_c" "_x")
  (carc))
((= obj "ARC")
  (command "_.break" p "@"
		   "_.pedit" p "_y" "_j" nam (entlast) "" "_x")
  (carc))
(T nil))
 (setq ltp (cdr (assoc 6 ent))
	lyr (cdr (assoc 8 ent))
	clr (cdr (assoc 62 ent))
	lts (cdr (assoc 48 ent))
	wid (cdr (assoc 40 ent))
	flgs (cdr (assoc 70 ent)))
 (if (not ltp)(setq ltp "bylayer"))
 (cond
((= obj "LINE")
  (setq first (assoc 10 ent)
		final (assoc 11 ent)
		ent (subst (cons 10 (cdr final)) first ent)
		ent (subst (cons 11 (cdr first)) final ent))
  (entmod ent))
((= obj "LWPOLYLINE")
  (setq final (cdr (assoc 10 (setq ent (reverse ent))))
		next (cdr (assoc 10 (cdr (member (assoc 10 ent) ent)))))
  (prev))
((= obj "POLYLINE")
  (setq spl (= (logand flgs 4) 4)
		cur (= (logand flgs 2) 2)
		vert (entnext nam))
  (if cur
	(command "_.pedit" p "_s" ""))
  (while (= (cdr (assoc 0 (entget (setq vert (entnext vert))))) "VERTEX")
	(setq next final
		  final (cdr (assoc 10 (entget vert)))))
  (prev))
(T (alert "Not a REVersible object.")))
 (command "_.undo" "_e")
 (setvar "cmdecho" cmde)
 (setvar "blipmode" blip)
 (setvar "osmode" snap)
 (setvar "celtscale" ltsc)
 (setvar "cecolor" cclr)
 (setvar "plinewid" pwid)
 (setvar "plinegen" pgen)
 (setvar "clayer" clyr)
 (setq *error* olderr)
 (princ)
)
(defun carc ()
 (setq ent (entget (entlast))
	nam (cdr (assoc -1 ent))
	obj (cdr (assoc 0 ent)))
)
(defun prev ()
 (setq a (angle next final)
	clos (= (logand flgs 1) 1))
 (if clos (command "_.pedit" nam "_o" ""))
 (setq zoomit (null (ssget "c" final final)))
 (if zoomit (command "_.zoom" "_c" final ""))
 (if clr (command "_.color" clr))
 (if lts (setvar "celtscale" lts))
 (setvar "clayer" lyr)
;  (setvar "celtype" ltp)
 (command "_.pline" (polar final a 0.0001) final ""
	   "_.chprop" (entlast) "" "_lt" ltp ""
	   "_.pedit" (entlast) "_j" nam "" ""
	   "_.break" final (polar final a 0.001))
 (if cur (command "_.pedit" (entlast) "_f" ""))
 (if spl (command "_.pedit" (entlast) "_s" ""))
 (if clos (command "_.pedit" (entlast) "_c" ""))
 (if wid (command "_.pedit" (entlast) "_w" wid ""))
 (if zoomit (command "_.zoom" "_p"))
)
;;; (alert (strcat "REV.LSP © 1999-2001 Tee Square Graphics\n\n" 
;;;				"			  Type REV to begin."))
(princ)

Bác philip ui, lisp của bác tạo thêm 1 node nữa nên không thích hợp với công việc của em lắm. Em đã viết 1 đoạn code và có chút vướng mắc mong các bác chỉ cho.

(defun c:thu (/ C10 C40 C41 C42 C50 C70 ENT ENT2 I SS SSN SSN2 N10 N40 N41 N50 N70 N N42 NC42)
 (while (null(setq ss (entsel "\n Chon polyline: "))))
 (setq ssn (car ss))
 (setq ent (entget ssn))  
 (setq c42 (append c42 (list(cons 42 0))))
 (if (= (cdr(assoc 0 ent)) "POLYLINE")
   (progn
     (if (=(cdr(assoc 66 ent)) 1)
(progn
  (setq ssn2 (entnext ssn))
  (setq ent2 (entget ssn2))	  
  (While(/= (cdr(assoc 0 ent2)) "SEQEND")
    (setq c10 (append c10 (list(assoc 10 ent2))))
    (setq c40 (append c40 (list(assoc 40 ent2))))
    (setq c41 (append c41 (list(assoc 41 ent2))))
    (setq c42 (append c42 (list(assoc 42 ent2))))
    (setq c70 (append c70 (list(assoc 70 ent2))))
    (setq c50 (append c50 (list(assoc 50 ent2))))
    (setq ssn2 (entnext ssn2))
    (setq ent2 (entget ssn2))
    )
  )
)
     )
   )  
 (setq n (- (length c42) 1))
 (setq i 0)
 (while (<= i n)
   (setq nc42 (append nc42 (list(nth i c42))))
   (setq i (1+ i))
   )
 (setq c42 nil c42 nc42)
 (setq ss (ssget "_P"))
 (setq ent (entget ssn))
 (if (= (cdr(assoc 0 ent)) "POLYLINE")
   (progn
     (if (=(cdr(assoc 66 ent)) 1)
(progn
  (setq i 0)
  (setq ssn2 (entnext ssn))
  (setq ent2 (entget ssn2))
  (setq n10 (reverse c10))
  (setq n40 (reverse c40))
  (setq n41 (reverse c41))
  (setq n42 (reverse c42))
  (setq n70 (reverse c70))
  (setq n50 (reverse c50))
  (While(/= (cdr(assoc 0 ent2)) "SEQEND")
    (setq ent2 (subst (nth i n10) (nth i c10) ent2))
    (setq ent2 (subst (nth i n40) (nth i c40) ent2))
    (setq ent2 (subst (nth i n41) (nth i c41) ent2))
;;;	    (setq ent2 (subst (nth i n42) (nth i c42) ent2))
    (setq ent2 (subst (cons 42 (- 0 (cdr(nth i n42)))) (nth i c42) ent2))
    (setq ent2 (subst (nth i n70) (nth i c70) ent2))
    (setq ent2 (subst (nth i n50) (nth i c50) ent2))
    (entmod ent2)
    (setq i (1+ i))
    (setq ssn2 (entnext ssn2))
    (setq ent2 (entget ssn2))
    )
  )
)
     )
   )	    
 (princ)
 )

Tại những polyline có arc khi thay đổi chiều của các đỉnh thì nó bị lệch các bác chỉ giúp em làm sao để nó không lệch nữa với. THANKS

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  

×