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

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

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

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!

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

  • Vote tăng 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
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.

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

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

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

  • Vote tăng 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
Đâ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.

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ù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!

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 đá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.

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á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 ạ.

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
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!

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

  • Vote tăng 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
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?

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

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
Đâ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.

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
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ả

  • Vote tăng 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
Đú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)
)

  • Vote tăng 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

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í đó.

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á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! :(

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

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

)

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á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! :(

Vậy thì bạn dùng cái này xem sao them dinh Pline

Lệnh là IV (insert vertex)

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

lisp này cũng tốt đấy chứ. Chỉ có điều nếu tách nhập điểm riêng thì người dùng bắt điểm chính xác hơn.

  • 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
Vậy thì bạn dùng cái này xem sao them dinh vao duong pline

Lệnh là IV (insert vertex)

Chào bạn nataca!

Cám ơn bạn đã tham gia viết lisp giúp mính, nhưng sao khi chay lisp của bạn lại xuất hiện bảng thông báo này: :(

http://www.cadviet.com/upfiles/ScreenShot001_1.jpg

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
Chào bạn nataca!

Cám ơn bạn đã tham gia viết lisp giúp mính, nhưng sao khi chay lisp của bạn lại xuất hiện bảng thông báo này: :(

http://www.cadviet.com/upfiles/ScreenShot001_1.jpg

thôi toi :( . Mình quên không bỏ cái khoá đi. Mình edit lại rồi đấy.

  • 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
thôi toi :( . Mình quên không bỏ cái khoá đi. Mình edit lại rồi đấy.

Ngon lành rồi đó bạn nataca!

Nhưng nếu mình muốn pick nhiều điểm mà ko cần nhập lại lệnh, bạn có thể Edit lại giúp mình đc ko? Mình ko biết AutoLisp.

Thanks bạn nataca rất nhiều.

Chúc bạn vui!

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  

×