Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
30 replies to this topic

#1 sam8xd

sam8xd

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 12 September 2011 - 10:58 PM

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

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 12 September 2011 - 11:11 PM

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ề...
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 September 2011 - 11:16 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#4 sam8xd

sam8xd

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 13 September 2011 - 07:13 AM

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

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 September 2011 - 07:20 AM

Bạn Break bằng cách nào vậy ?
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 13 September 2011 - 08:18 AM

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

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 September 2011 - 08:23 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#8 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 13 September 2011 - 08:27 AM

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

#9 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 September 2011 - 11:01 AM

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ề,.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#10 sam8xd

sam8xd

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 14 September 2011 - 07:52 PM

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

#11 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 14 September 2011 - 08:33 PM

Đú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))
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 sam8xd

sam8xd

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 14 September 2011 - 09:39 PM

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

#13 sam8xd

sam8xd

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 14 September 2011 - 09:41 PM

À 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ỉ?
  • 0

#14 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 14 September 2011 - 10:45 PM

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.

Hình đã gửi
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 14 September 2011 - 11:47 PM


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.

Hình đã gửi

Đã 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 à
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#16 minhngockt

minhngockt

    biết vẽ pline

  • Members
  • PipPip
  • 68 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 14 September 2011 - 11:53 PM

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

#17 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 15 September 2011 - 09:09 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 15 September 2011 - 09:19 AM

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

  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#19 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 15 September 2011 - 10:05 AM

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

Ket thử test file này xem sao nhé
http://www.cadviet.c...s/3/break_1.dwg
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#20 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 15 September 2011 - 10:12 AM

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

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC