Đến nội dung


Hình ảnh
- - - - -

Sắp xếp đỉnh polyline


  • Please log in to reply
10 replies to this topic

#1 18011985

18011985

    biết lệnh properties

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

Đã gửi 27 September 2010 - 03:22 PM

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.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#2 VUVUZELA

VUVUZELA

    biết lệnh chamfer

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

Đã gửi 27 September 2010 - 03:38 PM

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

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#3 18011985

18011985

    biết lệnh properties

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

Đã gửi 27 September 2010 - 03:50 PM

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.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#4 VUVUZELA

VUVUZELA

    biết lệnh chamfer

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

Đã gửi 27 September 2010 - 04:16 PM

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

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#5 18011985

18011985

    biết lệnh properties

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

Đã gửi 27 September 2010 - 04:30 PM

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.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#6 VUVUZELA

VUVUZELA

    biết lệnh chamfer

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

Đã gửi 27 September 2010 - 05:02 PM

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
:(
  • 0

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#7 18011985

18011985

    biết lệnh properties

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

Đã gửi 27 September 2010 - 05:13 PM

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ẻ.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#8 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 27 September 2010 - 05:47 PM

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

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#9 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 28 September 2010 - 03:54 PM

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
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#10 18011985

18011985

    biết lệnh properties

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

Đã gửi 29 September 2010 - 12:07 PM

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 ý.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#11 18011985

18011985

    biết lệnh properties

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

Đã gửi 05 October 2010 - 04:34 PM

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
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.