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

[Hỏi]Chọn đối Tượng Pline Sau Khi Break

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

Mình có 1 pline qua các điểm PT1 PT2 PT3 PT4

Sau khi dùng lệnh break từ PT2 đến PT3 thì được 2 pline: đoạn 1 từ PT1 đến PT2, đoạn 2 từ PT3 đến PT4

Mình dùng lệnh entlast thì chọn được đoạn 2

Giờ mình muốn chọn đoạn 1 thì làm sao 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ó 1 pline qua các điểm PT1 PT2 PT3 PT4

Sau khi dùng lệnh break từ PT2 đến PT3 thì được 2 pline: đoạn 1 từ PT1 đến PT2, đoạn 2 từ PT3 đến PT4

Mình dùng lệnh entlast thì chọn được đoạn 2

Giờ mình muốn chọn đoạn 1 thì làm sao nhỉ ?

Hề hề hề,

Nếu mình không nhầm thì đoạn 1 sẽ mang chính cái tên (ename of entity) của pline gốc.

Vì thế bạn đừng dùng entlast mà hãy dùng chính cái biến mà bạn đã dùng khi break.

Hề hề hề, chỉ là những điều đoán mò, bạn hãy thử xem và đừng giận nếu như nó không đúng ý bạn.....

Hề hề hề...

  • 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

Sau khi dùng Break sẽ hình thành 2 đối tượng :

- 1 : đối tượng mang ename mới (entlast)

- 2 : đối tượng mang ename cũ (ename của đối tượng Pline đầu)

  • 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

Pline gốc: ((-1 . <Entity name: 7ef5fe98>) (0 . "POLYLINE") (330 . <Entity name: 7ef5fcf8>)

Đoạn 1: ((-1 . <Entity name: 7ef5fec8>) (0 . "POLYLINE") (330 . <Entity name: 7ef5fcf8>)

Đoạn 2: ((-1 . <Entity name: 7ef5fef8>) (0 . "POLYLINE") (330 . <Entity name: 7ef5fcf8>)

Đều giống nhau ở mã 330 thôi, chứ ename nó lại khác 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

Hàm (handent handle) sẽ trả về đối tượng có số thứ tự là handle.

 

đoạn thẳng thứ 2 là đoạn thẳng được tạo ra kế tiếp từ đoạn thẳng gốc. Nếu bạn không lưu trữ Entity của đoạn thẳng gốc, thì bạn phải tìm handle của đoạn thẳng thứ 2 (entlast), suau đó lấy entity đoạn thẳng gốc bằng (handent (- handle 1)).

 

Lưu ý : handle lưu trữ dưới dạng HEX.

  • 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

@npham : handent có cách hình thành tương tự ename (chỉ khác là cái thì lưu lại, cái thì không), nên nếu sau đối tượng Pline gốc ta còn tạo 1 loạt các đối tượng khác, thì sau khi Break, handent -1 không phải là đoạn thẳng gố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

@npham : handent có cách hình thành tương tự ename (chỉ khác là cái thì lưu lại, cái thì không), nên nếu sau đối tượng Pline gốc ta còn tạo 1 loạt các đối tượng khác, thì sau khi Break, handent -1 không phải là đoạn thẳng gốc ^^

Ờ nhỉ ! :D

 

Vậy chỉ có cách là khi chọn object để break , ta lưu ngay nó lại. hehe

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

Pline gốc: ((-1 . <Entity name: 7ef5fe98>) (0 . "POLYLINE") (330 . <Entity name: 7ef5fcf8>)

Đoạn 1: ((-1 . <Entity name: 7ef5fec8>) (0 . "POLYLINE") (330 . <Entity name: 7ef5fcf8>)

Đoạn 2: ((-1 . <Entity name: 7ef5fef8>) (0 . "POLYLINE") (330 . <Entity name: 7ef5fcf8>)

Đều giống nhau ở mã 330 thôi, chứ ename nó lại khác nhau.

Hề hề hề,

Bạn hãy kiểm tra lại, không nhẽ CAD của bạn có cách làm việc khác với cách thông thường hay sao????

Mình đã check nhiều lần và cũng đã dùng cái ni cho khá nhiều lisp mà nó vẫn chạy bon bon mà....

Hề hề hề,.....

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 mọi người giúp đỡ. Mình dùng Cad 2005. Đúng là LWPOLYLINE break thì CAD chỉ tạo thêm 1 ename. Nhưng POLYLINE thì lại tạo ra 2 ename mới.

  • 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

Đúng là vậy. Nếu bạn không ủ topic quá lâu thì mọi người đỡ thắc mắc lâu rồi ^^

Trước khi Break bạn lấy entlast :

(setq elast (entlast))

Sau khi break thì đoạn 1, 2 lấy như sau :

(setq e1 (entnext elast) e2 (entlast))

  • 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ách của anh ketxu chỉ đúng khi Pline bị break chính là đối tượng elast. Nếu đối tượng elast khác đi thì vẫn không phải:

 

PL0 ((-1 . <Entity name: 7e6b1060>)

PL1 ((-1 . <Entity name: 7e6b10a0>)

(setq elast (entlast)) <Entity name: 7e6b10a0> -> chính là PL1

Break PL0 được PL01 và PL02

PL01 ((-1 . <Entity name: 7e6b10e0>)

(setq e1 (entnext elast)) <Entity name: 7e6b10a8> -> ((-1 . <Entity name: 7e6b10a8>) (0 . "VERTEX") là đỉnh 0 của PL1

PL02 ((-1 . <Entity name: 7e6b1108>)

(setq e2 (entlast)) <Entity name: 7e6b1108>

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à buổi tối về nhà dùng mạng FPT thì vào cadviet.com bình thường, còn lên cty dùng mạng VNPT hay VL gì đó thì chịu không vào được là sao anh em 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

Cách của anh ketxu chỉ đúng khi Pline bị break chính là đối tượng elast. Nếu đối tượng elast khác đi thì vẫn không phải:

 

PL0 ((-1 . <Entity name: 7e6b1060>)

PL1 ((-1 . <Entity name: 7e6b10a0>)

(setq elast (entlast)) <Entity name: 7e6b10a0> -> chính là PL1

Break PL0 được PL01 và PL02

PL01 ((-1 . <Entity name: 7e6b10e0>)

(setq e1 (entnext elast)) <Entity name: 7e6b10a8> -> ((-1 . <Entity name: 7e6b10a8>) (0 . "VERTEX") là đỉnh 0 của PL1

PL02 ((-1 . <Entity name: 7e6b1108>)

(setq e2 (entlast)) <Entity name: 7e6b1108>

 

Ta dùng hàm này để tô màu đối tượng ename en nhé :

(defun check (en color)(vla-put-color (vlax-ename->vla-object en) color))

Bên dưới là video ketxu thử vẽ vài đối tượng khác, lấy entlast (tất nhiên lúc này sẽ không phải là Pline bị Break), sau đó break và lấy lại e1, e2.

 

TestBreak-1.gif

  • 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

 

Ta dùng hàm này để tô màu đối tượng ename en nhé :

(defun check (en color)(vla-put-color (vlax-ename->vla-object en) color))

Bên dưới là video ketxu thử vẽ vài đối tượng khác, lấy entlast (tất nhiên lúc này sẽ không phải là Pline bị Break), sau đó break và lấy lại e1, e2.

 

TestBreak-1.gif

Đã vote cho Ket. Tuy nhiên kiểm tra (không dùng hàm check mà dùng erase e1 và e2) thì có khi đúng và có khi không, Ket à

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ước tiên em xin lỗi ban quản trị vì đã vào không đúng toppic để hỏi bài. Nhưng account của em không tạo được new toppic, em cũng không hiểu nguyên nhân vì sao. Em vào toppic này để nhờ các bác giúp em viết lisp nhập trực tiếp giá trị text vào att block được không ạ ?chẳng hạn em có 1 att block gồm có 2 thông số, 1 là cao độ tự nhiên (cdtn), 2 là cao độ thiết kế (cdtk), em muốn dòng lệnh đầu chọn text, sau chọn att block, chọn thông số muốn điền vào. Em cảm ơn các bác rất 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ỉ cần biết khi nào đúng khi nào không thì sẽ "xử" được nó ngay, chứ e cũng k test hết các trường hợp đâ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ước tiên em xin lỗi ban quản trị vì đã vào không đúng toppic để hỏi bài. Nhưng account của em không tạo được new toppic, em cũng không hiểu nguyên nhân vì sao. Em vào toppic này để nhờ các bác giúp em viết lisp nhập trực tiếp giá trị text vào att block được không ạ ?chẳng hạn em có 1 att block gồm có 2 thông số, 1 là cao độ tự nhiên (cdtn), 2 là cao độ thiết kế (cdtk), em muốn dòng lệnh đầu chọn text, sau chọn att block, chọn thông số muốn điền vào. Em cảm ơn các bác rất nhiều

Thử cái này xem đúng ý bạn không nhé!

;Doan Van Ha
(defun C:HA()
(setq txt (cdr (assoc 1 (entget (car (entsel "\nChon Text: "))))))
(setq att (entsel "\nChon Block: "))
(initget "TN TK") (setq ts (getkword "\nChon loai cao do de thay: TN/TK: "))
(if (= ts "TN")
 (entmod  (subst (cons 1 txt) (cons 1 (cdr (assoc 1 (entget (entnext (car att)))))) (entget (entnext (car att)))))
 (entmod  (subst (cons 1 txt) (cons 1 (cdr (assoc 1 (entget (entnext (entnext (car att))))))) (entget (entnext (entnext (car att)))))))
(entupd (car att)))

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ước tiên em xin lỗi ban quản trị vì đã vào không đúng toppic để hỏi bài. Nhưng account của em không tạo được new toppic, em cũng không hiểu nguyên nhân vì sao. Em vào toppic này để nhờ các bác giúp em viết lisp nhập trực tiếp giá trị text vào att block được không ạ ?chẳng hạn em có 1 att block gồm có 2 thông số, 1 là cao độ tự nhiên (cdtn), 2 là cao độ thiết kế (cdtk), em muốn dòng lệnh đầu chọn text, sau chọn att block, chọn thông số muốn điền vào. Em cảm ơn các bác rất nhiều

 

Yêu cầu của bạn tương tự như copy Text, nên dùng cái này thì chủ động hơn :

(defun C:tt( / source )
;@Ketxu 15 -9 base on CAB copy
 (vl-load-com) 
 (and
 (setq source (car (nentsel "\nCh\U+1ECDn Text / Mtext / Attdef / Attrib ngu\U+1ED3n : ")))
 (setvar "errno" 0)
 (or
  (vl-position (cdadr (entget source))'("TEXT" "ATTRIB" "MTEXT" "ATTDEF"))
  (prompt "\nCh\U+1ECDn sai lo\U+1EA1i \U+0111\U+1ED1i t\U+01B0\U+1EE3ng !")
 )
)
(setq text (vla-get-textstring (vlax-ename->vla-object source)))
(princ (strcat "\Text ngu\U+1ED3n : " text))
(while (/= (getvar "errno") 52)
 	(and
   	(setq pick (nentsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng c\U+1EA7n thay \U+0111\U+1ED5i : "))
   	(setq target (car pick))
   	(setq ent	(entget target)
         	layer  (cdr (assoc 8 ent))
         	target (vlax-ename->vla-object target)
   	)
   	(or
     	(= (length pick) 2)
     	(prompt "\n\U+0110\U+1ED1i t\U+01B0\U+1EE3ng n\U+1EB1m s\U+00E2u trong Block ho\U+1EB7c Xref !")
   	)
   	(or
     	(vl-position (cdadr ent) '("TEXT" "ATTRIB" "MTEXT" "ATTDEF"))
     	(prompt "\nCh\U+1ECDn sai lo\U+1EA1i \U+0111\U+1ED1i t\U+01B0\U+1EE3ng !")
   	)
   	(or
     	(/= (logand 4 (cdr (assoc 70 (tblsearch "layer" layer)))) 4)
     	(prompt (strcat "\nLayer " layer " \U+0111ang b\U+1ECB kh\U+00F3a !"))
   	)       
   	(and
     	(not (vla-put-textstring target text))
     	(/= (vla-get-textstring target) text)
     	(princ "\nCopy Text th\U+1EA5t b\U+1EA1i !")
   	)
 	)
)
 )

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

Ket thử test file này xem sao nhé

http://www.cadviet.c...s/3/break_1.dwg

Ôi, thì đó là trường hợp LWPline với Pline thôi. Với LWP thì nó giống ban đầu e và bác Bình nói. Nếu 3dPline thì nó giống đoạn sau

=> Tổng quát : Kiểm tra type của đối tượng trước khi break để biết cần lấy gì :| Không thì kiểm tra e1 = e2

(còn Line, SPline... nữa, nên bạn chủ topic tự kiểm nghiệm cách thức CAD làm việc 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

Ý em muốn nói là nếu elast là 1 polyline thì (setq e1 (entnext elast)) -> sẽ là đỉnh thứ 1 của pline đó chứ chưa phải là đoạn 1 vừa break ra.

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êu cầu của bạn tương tự như copy Text, nên dùng cái này thì chủ động hơn :

(defun C:tt( / source )
;@Ketxu 15 -9 base on CAB copy
 (vl-load-com)
 (and
 (setq source (car (nentsel "\nCh\U+1ECDn Text / Mtext / Attdef / Attrib ngu\U+1ED3n : ")))
 (setvar "errno" 0)
 (or
  (vl-position (cdadr (entget source))'("TEXT" "ATTRIB" "MTEXT" "ATTDEF"))
  (prompt "\nCh\U+1ECDn sai lo\U+1EA1i \U+0111\U+1ED1i t\U+01B0\U+1EE3ng !")
 )
)
(setq text (vla-get-textstring (vlax-ename->vla-object source)))
(princ (strcat "\Text ngu\U+1ED3n : " text))
(while (/= (getvar "errno") 52)
 	(and
   	(setq pick (nentsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng c\U+1EA7n thay \U+0111\U+1ED5i : "))
   	(setq target (car pick))
   	(setq ent	(entget target)
         	layer  (cdr (assoc 8 ent))
         	target (vlax-ename->vla-object target)
   	)
   	(or
     	(= (length pick) 2)
     	(prompt "\n\U+0110\U+1ED1i t\U+01B0\U+1EE3ng n\U+1EB1m s\U+00E2u trong Block ho\U+1EB7c Xref !")
   	)
   	(or
     	(vl-position (cdadr ent) '("TEXT" "ATTRIB" "MTEXT" "ATTDEF"))
     	(prompt "\nCh\U+1ECDn sai lo\U+1EA1i \U+0111\U+1ED1i t\U+01B0\U+1EE3ng !")
   	)
   	(or
     	(/= (logand 4 (cdr (assoc 70 (tblsearch "layer" layer)))) 4)
     	(prompt (strcat "\nLayer " layer " \U+0111ang b\U+1ECB kh\U+00F3a !"))
   	)      
   	(and
     	(not (vla-put-textstring target text))
     	(/= (vla-get-textstring target) text)
     	(princ "\nCopy Text th\U+1EA5t b\U+1EA1i !")
   	)
 	)
)
 )

em cảm ơn bác. Đúng là cái em cầ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

À thú thực thì mình vẫn chưa hiểu câu hỏi lắm, nhưng láng máng là nếu elast là Pline3D thì sẽ có vấn đề đúng k ^^

Vậy thì bạn cheat đi, tạo 1 point ở đâu đó rồi lấy elast, hêt rountine thì xóa đi ^^ Khà khà

  • 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

Anh vẽ 1 polyline xong (PL1).

Rồi vẽ thêm 1 polyline nữa (PL2)

Dùng lệnh entlast sẽ được PL2

Rồi Break PL1 được PL11 và PL12

Xong rồi dùng cách anh để xác định thì (setq e1 (entnext elast)) sẽ ra vertex thứ 1 của polyline PL2 chứ chưa ra PL11

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  

×