Đến nội dung


Hình ảnh
* * * - - 2 Bình chọn

Thêm node vào đường Pline


  • Please log in to reply
75 replies to this topic

#1 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 28 April 2009 - 04:05 PM

Chào các bạn
Mình có một đoạn Pline giờ mình muốn thêm một số node trên đường Pline đó (chia Pline thành nhiều đoạn Pline liền nhau) để nắn sửa nó cho phù hợp với hiện trạng.
Bạn nào biết cách thêm Node vào đường Pline chỉ mình với!
Cám ơn vì đã xem tin!
  • 1

#2 SONCAD

SONCAD

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 819 Bài viết
Điểm đánh giá: 862 (rất tốt)

Đã gửi 28 April 2009 - 04:08 PM

Chào các bạn
Mình có một đoạn Pline giờ mình muốn thêm một số node trên đường Pline đó (chia Pline thành nhiều đoạn Pline liền nhau) để nắn sửa nó cho phù hợp với hiện trạng.
Bạn nào biết cách thêm Node vào đường Pline chỉ mình với!
Cám ơn vì đã xem tin!

Bạn đánh Pe/Edit vertex/insert.
  • 2
Hình đã gửi

#3 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 28 April 2009 - 04:15 PM

Bạn đánh Pe/Edit vertex/insert.

Cám ơn bạn! Nhưng cái này ko đc thuận tien cho lắm hihi
Có cach nào mình chỉ cần gõ lệnh sau đó chỉ việc click chổ nào thì nó sẽ thêm node chổ đó ko? Kiểu gần giống như lệnh Break vậy đó. Mình gõ lệnh và chon những vị trí cần thêm.
  • 1

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 28 April 2009 - 10:04 PM

Cám ơn bạn! Nhưng cái này ko đc thuận tien cho lắm hihi
Có cach nào mình chỉ cần gõ lệnh sau đó chỉ việc click chổ nào thì nó sẽ thêm node chổ đó ko? Kiểu gần giống như lệnh Break vậy đó. Mình gõ lệnh và chon những vị trí cần thêm.

Chưa hiểu ý của bạn lắm. Bạn nên upload file .dwg lên diễn đàn và nói rõ hơn cái điều bạn muốn
Chúc bạn vui
  • 0

#5 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 09:26 AM

Chưa hiểu ý của bạn lắm. Bạn nên upload file .dwg lên diễn đàn và nói rõ hơn cái điều bạn muốn
Chúc bạn vui

Như thế này nè bạn. Khi mình dùng lệnh Break: BR -> chon d.tuong -> chon vị trí cần bẻ gãy => Kết quả là đoạn Pline bị cắt thành 2 đoạn Pline rời nhau.
Mình muốn tỉm lệnh nào đó tương tự như lệnh Break => nhưng kết quả là đoạn Pline sẽ đc chia thành nhiều đoạn pline liền nhau (vẫn là 1 pline chứ ko thành 2 hay nhiều đoạn pline riêng biệt như lệnh break)
Chúc bạn vui.
  • 0

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 29 April 2009 - 09:59 AM

Như thế này nè bạn. Khi mình dùng lệnh Break: BR -> chon d.tuong -> chon vị trí cần bẻ gãy => Kết quả là đoạn Pline bị cắt thành 2 đoạn Pline rời nhau.
Mình muốn tỉm lệnh nào đó tương tự như lệnh Break => nhưng kết quả là đoạn Pline sẽ đc chia thành nhiều đoạn pline liền nhau (vẫn là 1 pline chứ ko thành 2 hay nhiều đoạn pline riêng biệt như lệnh break)
Chúc bạn vui.

Đây là đoạn Code Tue_NV viết theo ý bạn. Hy vọng bạn hài lòng.
Có thể hiện sáng đối tượng khi bạn pick điểm.
Hãy chạy thử xem nhé :
(defun c:NBPL()
(vl-load-com)
(setq ss (car (entsel "\n Pick chon doi tuong : ")))
(Hli ss)
(setq po (getpoint "\n Chon diem cat : "))
(setq ddau (vlax-curve-getStartPoint ss))
(setq dcuoi (vlax-curve-getEndPoint ss))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(Hli ss)
(while po (setq po (getpoint "\n Chon diem cat tiep theo : "))
(Command "select" ddau dcuoi "")
(setq ss (ssget "P"))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(sssetfirst ss ss)
)
(princ)
)
;
(defun HLI(ent)
(sssetfirst (ssadd ent (ssadd)) (ssadd ent (ssadd)))
)

  • 2

#7 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 10:08 AM

Đây là đoạn Code Tue_NV viết theo ý bạn. Hy vọng bạn hài lòng.
Có thể hiện sáng đối tượng khi bạn pick điểm.
Hãy chạy thử xem nhé :

(defun c:NBPL()
(vl-load-com)
(setq ss (car (entsel "\n Pick chon doi tuong : ")))
(Hli ss)
(setq po (getpoint "\n Chon diem cat : "))
(setq ddau (vlax-curve-getStartPoint ss))
(setq dcuoi (vlax-curve-getEndPoint ss))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(Hli ss)
(while po (setq po (getpoint "\n Chon diem cat tiep theo : "))
(Command "select" ddau dcuoi "")
(setq ss (ssget "P"))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(sssetfirst ss ss)
)
(princ)
)
;
(defun HLI(ent)
(sssetfirst (ssadd ent (ssadd)) (ssadd ent (ssadd)))
)

Đúng rồi đó, nhưng bạn có thể sửa thêm tí nữa đc ko? Vì đối với đường Pline khép kín khi thêm node nó lại bẻ gãy đường Pline thành 2 (hoặc nhiều hơn) đường Pline riêng biệt. Mình muốn nó vẫn là 1 Pline duy nhất như đối với đường Pline hở.
Cám ơn bạn rất nhiều, chúc bạn vui, khoẻ và thành công.
  • 0

#8 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 10:41 AM

Dùng explorer Pline đó ra->ta sẽ có các line -> dùng lệnh Mpedit để biến các line đó thành pline. Kín hở đều ok mà

Bạn chưa hiểu đúng ý mình rồi. hic.hic
Mình chỉ muốn thêm node vào đường Pline thôi.
Cám ơn bạn vì đã xem tin!
  • 0

#9 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 29 April 2009 - 10:50 AM

Bạn đánh Pe/Edit vertex/insert.

Chuẩn không cần chỉnh. Cứ dùng cách này chắc chắn được.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#10 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 29 April 2009 - 10:54 AM

Cám ơn bạn! Nhưng cái này ko đc thuận tien cho lắm hihi
Có cach nào mình chỉ cần gõ lệnh sau đó chỉ việc click chổ nào thì nó sẽ thêm node chổ đó ko? Kiểu gần giống như lệnh Break vậy đó. Mình gõ lệnh và chon những vị trí cần thêm.

Chào bạn AGI,
Bạn xài thử cái này coi sao. Líp này chỉ chèn thêm diểm vào pline mà chả làm thêm bất cứ động tác nào. Kín hở gì cũng vậy bạn ạ. Miễn rằng bạn phải pick điểm chọn đúng trên pline mà thôi.
(defun c:p ()
(setq pdm (getvar "pdmode")
ols (getvar "osmode"))
(setvar "pdmode" 3)
(setvar "osmode" 0)
(command "point" (getpoint "\n Chon diem can them"))
(setvar "pdmode" pdm)
(setvar "osmode" ols)
(princ)
)

Nếu bạn muốn một lần chạy chọn nhiều điểm thì phải làm thêm một vòng lặp While nữa bạn ạ.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#11 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 10:59 AM

Chuẩn không cần chỉnh. Cứ dùng cách này chắc chắn được.

Lenh PE thì chuẩn rồi nhưng mất quá nhiều thao tác để thêm đc vài node vào đường Pline.
CAD mà, tất cả đều có thể thực hiện đc bằng cách này hay cách khác, hơn nhau là ở chổ nhanh hay chậm, ít hay nhiều thao tác thôi.
Cám ơn bạn vì đã xem tin, chúc bạn vui!
  • 0

#12 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 29 April 2009 - 10:59 AM

Chào bạn AGI,
(command "point" (getpoint "\n Chon diem can them"))

Bác phamthanhbinh hiểu sai ý yêu cầu rồi. Bạn ấy muốn thêm đỉnh cho pline chứ không phải chèn cái point vào đâu bác.

Thao tác dùng lệnh pe để làm việc này như sau:
-Gỏ lệnh PE.
-Chọn PLINe.
-Gỏ E (Edit vertex)
-Lúc này xuất hiện dấu x tại đỉnh đầu tiên của pline. khi gỏ N enter thì nó tiến lên 1 vị trí đỉnh. Khi gỏ I thì yêu cầu chọn điểm tạo đỉnh mới nó sẻ tạo cái đỉnh mới từ đỉnh có dấu x đang hiện hửu tới vị trí vừa chọn.
*Muốn viết lisp làm việc này thì phải giải quyết được việc lấy thứ tự của đỉnh gần nhất phía trước của điểm cần thêm.
  • 2

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 29 April 2009 - 11:13 AM

Chào bạn AGI,
Bạn xài thử cái này coi sao. Líp này chỉ chèn thêm diểm vào pline mà chả làm thêm bất cứ động tác nào. Kín hở gì cũng vậy bạn ạ. Miễn rằng bạn phải pick điểm chọn đúng trên pline mà thôi.

(defun c:p ()
(setq pdm (getvar "pdmode")
ols (getvar "osmode"))
(setvar "pdmode" 3)
(setvar "osmode" 0)
(command "point" (getpoint "\n Chon diem can them"))
(setvar "pdmode" pdm)
(setvar "osmode" ols)
(princ)
)

Nếu bạn muốn một lần chạy chọn nhiều điểm thì phải làm thêm một vòng lặp While nữa bạn ạ.

Ý của AGI là thêm đỉnh cho phân đoạn chứ không phải là thêm point cho Polyline bác Bình à.
Bác cứ đọc Code trên của Tue_NV thì thấy rõ ngay.
To AGI : Ý của bạn có phải là Code trên của mình chạy đúng với Polylỉne hở chứ Polyline kín thì không còn đúng nữa phải không?
  • 1

#14 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 11:24 AM

Ý của AGI là thêm đỉnh cho phân đoạn chứ không phải là thêm point cho Polyline bác Bình à.
Bác cứ đọc Code trên của Tue_NV thì thấy rõ ngay.
To AGI : Ý của bạn có phải là Code trên của mình chạy đúng với Polylỉne hở chứ Polyline kín thì không còn đúng nữa phải không?

Chính xác là như thế đó bạn Tue_NV.
Đối với Pline hở thì ko thể tuyệt vời hơn, nhưng đối với Pline kín thì nó lại bẻ gãy Pline thàng 2-3 đoạn Pline rời nhau.
  • 0

#15 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 29 April 2009 - 11:32 AM

Đây là đoạn Code Tue_NV viết theo ý bạn. Hy vọng bạn hài lòng.
Có thể hiện sáng đối tượng khi bạn pick điểm.
Hãy chạy thử xem nhé :

(defun c:NBPL()
(vl-load-com)
(setq ss (car (entsel "\n Pick chon doi tuong : ")))
(Hli ss)
(setq po (getpoint "\n Chon diem cat : "))
(setq ddau (vlax-curve-getStartPoint ss))
(setq dcuoi (vlax-curve-getEndPoint ss))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(Hli ss)
(while po (setq po (getpoint "\n Chon diem cat tiep theo : "))
(Command "select" ddau dcuoi "")
(setq ss (ssget "P"))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(sssetfirst ss ss)
)
(princ)
)
;
(defun HLI(ent)
(sssetfirst (ssadd ent (ssadd)) (ssadd ent (ssadd)))
)

Chào bác Tue_NV,
Mình đọc lisp của bác rồi nhưng mà chưa hiểu cái tham số "@" của lệnh break bác ạ. Một số lisp khác trên diễn đàn đã sử dụng (Command "break" dt p p) để cắt đối tượng tại điểm chọn.
Hai cách dùng này có gì khác nhau và tại sao, bác có thể giải thích thêm một chút cho mình sáng ra được không?
Còn về cái sai của mình như bác và bác Duy nói là hoàn toàn chính xác do mình không phân biết được khái niệm node và point. Thành thực nhận lỗi và mong các bác chỉ dạy thêm. Giờ mình đã hiểu thêm node là gì.
Cám ơn các bác nhiều.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#16 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 29 April 2009 - 12:24 PM

Chào bác Tue_NV,
Mình đọc lisp của bác rồi nhưng mà chưa hiểu cái tham số "@" của lệnh break bác ạ. Một số lisp khác trên diễn đàn đã sử dụng (Command "break" dt p p) để cắt đối tượng tại điểm chọn.
Hai cách dùng này có gì khác nhau và tại sao, bác có thể giải thích thêm một chút cho mình sáng ra được không?
Còn về cái sai của mình như bác và bác Duy nói là hoàn toàn chính xác do mình không phân biết được khái niệm node và point. Thành thực nhận lỗi và mong các bác chỉ dạy thêm. Giờ mình đã hiểu thêm node là gì.
Cám ơn các bác nhiều.

"@" chẳng qua là toạ độ tương đối mà thôi
"@" tương đương với "@0,0"
Lấy ví dụ đơn giản nhé :
Vẽ 1 Line -> Bẽ gãy đối tượng tại 1 điểm p

Command: br break : Gõ Br
Select object: Pick chọn đối tượng
Specify second break point or [First point]: F : gõ F
Specify first break point: Chọn 1 điểm ( gọi điểm này là P1)
Specify second break point: @ (: gõ @ hay "@0,0") : gọi điểm này là P2
Nhập toạ độ điểm @ hay @0,0 theo toạ độ tương đối có nghĩa là P2 trùng với P1. Mà P2 trùng P1 suy ra lệnh được Break tại 1 điểm phải không bạn?

(Command "break" dt p p)
(Command "break" dt p "@")
(Command "break" dt p "@0,0")

Ba cách viết này như nhau. Sử dụng cách nào cũng được cả
  • 2

#17 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 29 April 2009 - 01:27 PM

Đúng rồi đó, nhưng bạn có thể sửa thêm tí nữa đc ko? Vì đối với đường Pline khép kín khi thêm node nó lại bẻ gãy đường Pline thành 2 (hoặc nhiều hơn) đường Pline riêng biệt. Mình muốn nó vẫn là 1 Pline duy nhất như đối với đường Pline hở.
Cám ơn bạn rất nhiều, chúc bạn vui, khoẻ và thành công.

Bạn chạy thử LISP này nhé.
(defun c:AddVertex (/ Sel Pt Obj CoordList cnt ParmPt cnt2 Ang tmpPt1 tmpPt2)
(if
(and
(setq Sel (entsel "\n Chon vi tri can them Node tren Polyline : "))
(= (cdr (assoc 0 (entget (car Sel)))) "LWPOLYLINE")
(setq Pt (trans (vlax-curve-getClosestPointTo (car Sel) (trans (cadr Sel) 1 0)) 0 (car Sel)))
(setq Obj (vlax-ename->vla-object (car Sel)))
(setq CoordList (vlax-get Obj 'Coordinates))
)
(progn
(setq cnt 0)
(setq ParmPt 1)
(while (< (1+ cnt) (length CoordList))
(setq cnt2
(if (>= (setq cnt2 (+ 2 cnt)) (length CoordList))
(- cnt2 (length CoordList))
cnt2
)
)
(setq Ang
(angle
(setq tmpPt1
(list
(nth cnt CoordList)
(nth (1+ cnt) CoordList)
)
)
(setq tmpPt2
(list
(nth cnt2 CoordList)
(nth (1+ cnt2) CoordList)
)
)
)
)
(if
(or
(equal (angle Pt tmpPt1) Ang 0.000001)
(equal (angle Pt tmpPt2) Ang 0.000001)
)
(setq cnt (length CoordList))
(progn
(setq ParmPt (1+ ParmPt))
(setq cnt (+ 2 cnt))
)
)
)
(vlax-invoke Obj 'AddVertex ParmPt (list (car Pt) (cadr Pt)))
)
)
(princ)
)

  • 2

#18 huyhuong

huyhuong

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 29 April 2009 - 02:06 PM

Mình chạy thử rồi Lisp rất ok nhưng để chọn được điểm chèn Node chính xác thì rất khó bạn Gia bach ah.

Ví dụ mình muốn thêm Node vào chính giữa 2 đỉnh của Polyline rất khó để chọn được vị trí đó.
  • 0

#19 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 02:07 PM

Cám ơn bạn gia bach, lisp của bạn viết khá ok nhưng chon điểm chưa đc chính xác lắm.
Chúc bạn vui! :(
  • 0

#20 AGi

AGi

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 29 April 2009 - 02:32 PM

Chào mọi người!
Mình thật sự rất vui và bất ngờ về sự nhiệt tình của các bạn đã tham gia trả lời, chia sẻ kinh nghiệm và viết lisp theo nội dung câu hỏi của mình.
Trong các lisp của các bạn đã giành thời gian viết thì lisp của bạn Tue_NV là mình thấy ok nhất nhưng nó còn một lỗi nhỏ là đối với đường Pline kín thì sau khi thêm node nó lại bẻ gãy đường Pline kín đó thành 2 đường Pline riêng biệt. Nếu bạn nào biết cách khắc phục thì sủa lisp đó lại giúp mình.
Cám ơn tất cả các bạn!
Đoạn lisp đó nè các bạn.
(defun c:NBPL()
(vl-load-com)
(setq ss (car (entsel "\n Pick chon doi tuong : ")))
(Hli ss)
(setq po (getpoint "\n Chon diem cat : "))
(setq ddau (vlax-curve-getStartPoint ss))
(setq dcuoi (vlax-curve-getEndPoint ss))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(Hli ss)
(while po (setq po (getpoint "\n Chon diem cat tiep theo : "))
(Command "select" ddau dcuoi "")
(setq ss (ssget "P"))
(Command "break" ss po "@")
(Command "Pedit" "m" ddau dcuoi "" "j" "0" "")
(sssetfirst ss ss)
)
(princ)
)
;
(defun HLI(ent)
(sssetfirst (ssadd ent (ssadd)) (ssadd ent (ssadd)))
)
  • 0