Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp xóa đối tượng


  • Please log in to reply
27 replies to this topic

#1 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 04 August 2011 - 05:19 PM

Nhờ các bác viết lisp xóa đối tượng trong bản vẽ . Yêu cầu em gửi theo file đính kèm :File
Mong các bác giúp
Cám ơn !
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 04 August 2011 - 08:49 PM

Yêu cầu chưa rõ ràng bạn ạ!
  • 2

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


#3 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 04 August 2011 - 09:17 PM

[quote name='NguyenNgocSon' date='04 August 2011 - 05:19 PM' timestamp='1312453140' post='163033']
Nhờ các bác viết lisp xóa đối tượng trong bản vẽ . Yêu cầu em gửi theo file đính kèm :File
Mong các bác giúp
Cám ơn !

Hình đã gửi
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#4 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 05 August 2011 - 08:43 AM

Yêu cầu chưa rõ ràng bạn ạ!

Rất cám ơn ketxu đã quan tâm. Nếu bình thường dùng lệnh Find cũng xóa được nhưng ý tưởng của mình như sau:
+ Viết code lọc các text có giá trị "1:0" và góc nghiêng là 270độ, tương tự với text "1:66.67" với góc nghiêng rồi xóa các text này.
+ Trường hợp text "0%" nó có đính kèm mũi tên phía dưới, mình nghĩ là sẽ lọc text có giá trị "0%", góc 0độ, rồi sau đó sẽ tìm mũi tên cách text này 1 khoảng x. Rồi xóa nó đi như vậy có thể xóa được cả 0% và mũi tên ?
Vì Code lisp chưa tốt lắm. Mong các bác có thể giúp em thực hiện ý tưởng trên ?
Thân, Cám ơn !
  • 0

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 05 August 2011 - 08:59 AM

- Vậy là bạn đã vạch hướng cho công việc của mình rồi còn gì :
+ Lọc tất cả đối tượng thuộc layer ENTTNTHIETKE
+ Với Text : Chọn các text có mã 1 "*%*, có "1:", hoặc theo góc nghiêng... (tùy bạn)
+ Với Mũi tên dưới text % thì tạo 1 ssget với 4 điểm bao quanh text 1 khoảng x, gặp Pline 3vertext nào thì del đi (x tùy bạn)
Giờ bạn hiện thực hoá nó thôi. Bạn code k tốt thì code đến đâu hỏi đến đó, còn hơn cứ chờ mãi chờ mãi

Mình nói thật là những yêu cầu như thế này khó mà làm hài lòng bạn được, vì điều kiện lọc mông lung quá, mà bài toán thì lại mang tính cá biệt. Thậm chí hình bạn đưa ra với bài vừa viết bên trên chẳng khớp gì nhau :)


@Hoan2182 : Đề bài đưa ra để xóa hẳn text entity đi, mà Hoan replace có thể làm cho text không mang 1 ký tự nào, nhưng vẫn tồn tại trên bản vẽ mà không nhìn thấy được ^^
  • 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


#6 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 05 August 2011 - 02:01 PM

- Vậy là bạn đã vạch hướng cho công việc của mình rồi còn gì :
+ Lọc tất cả đối tượng thuộc layer ENTTNTHIETKE
+ Với Text : Chọn các text có mã 1 "*%*, có "1:", hoặc theo góc nghiêng... (tùy bạn)
+ Với Mũi tên dưới text % thì tạo 1 ssget với 4 điểm bao quanh text 1 khoảng x, gặp Pline 3vertext nào thì del đi (x tùy bạn)
Giờ bạn hiện thực hoá nó thôi. Bạn code k tốt thì code đến đâu hỏi đến đó, còn hơn cứ chờ mãi chờ mãi

Mình nói thật là những yêu cầu như thế này khó mà làm hài lòng bạn được, vì điều kiện lọc mông lung quá, mà bài toán thì lại mang tính cá biệt. Thậm chí hình bạn đưa ra với bài vừa viết bên trên chẳng khớp gì nhau :)


@Hoan2182 : Đề bài đưa ra để xóa hẳn text entity đi, mà Hoan replace có thể làm cho text không mang 1 ký tự nào, nhưng vẫn tồn tại trên bản vẽ mà không nhìn thấy được ^^

Mình đã thử code 1 đoạn xóa các text có giá trị 0% và góc 0 độ :
(defun c:loc ()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget "x" (list (cons 0 "TEXT") (cons 8 "ENTTNTHIETKE")))
k 0
tdoc (ssadd)
)
(while (< k (sslength ss))
(setq name (ssname ss k)
ent1 (entget name)
p1 (cdr (assoc 10 ent1))
goc (cdr (assoc 50 ent1))
nd (cdr (assoc 1 ent1))
)
(setq ent1 (entmod (subst (cons 41 0.8) (assoc 41 ent1) ent1)))
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
)
(setvar "osmode" oldos)
(command "undo" "e")
)
Nhưng chưa ổn. Lisp không chạy ?
Các bác xem giúp !
  • 0

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 05 August 2011 - 02:33 PM

Vì Erase có thể thao tác với cả tập chọn, nên để xóa text 0% thuộc lớp ENTTNTHIETKE, góc 0 độ bạn chỉ cần :

(if(setq ss (ssget "x" (list (cons 0 "TEXT") (cons 8 "ENTTNTHIETKE")(cons 1 "0%")(cons 50 0.0))))(command "erase" ss ""))


P/S : dòng này của bạn làm mình ngạc nhiên quá :
(setq ent1 (entmod (subst (cons 41 0.8) (assoc 41 ent1) ent1))) => Bạn cần entmod để thay đổi gì ?

(eq goc (/ (* 0 pi) 2)) => sao không đơn giản là 0 ??
  • 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 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 August 2011 - 02:42 PM

Mình đã thử code 1 đoạn xóa các text có giá trị 0% và góc 0 độ :

(defun c:loc ()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget "x" (list (cons 0 "TEXT") (cons 8 "ENTTNTHIETKE")))
k 0
tdoc (ssadd)
)
(while (< k (sslength ss))
(setq name (ssname ss k)
ent1 (entget name)
p1 (cdr (assoc 10 ent1))
goc (cdr (assoc 50 ent1))
nd (cdr (assoc 1 ent1))
)
(setq ent1 (entmod (subst (cons 41 0.8) (assoc 41 ent1) ent1)))
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
)
(setvar "osmode" oldos)
(command "undo" "e")
)
Nhưng chưa ổn. Lisp không chạy ?
Các bác xem giúp !

Lisp không chạy là do nó chưa thoát được vòng lặp While. K=0 bao giờ nó cũng nhỏ hơn (sslength ss) nếu tập ss có tồn tại. Bạn nên kiểm tra tập ss có tồn tại hay không rồi mới thực thi lệnh nhé.
Cách sửa code trên như sau :
Thêm dòng :
(setq k (1+ k))
Vị trí thêm :
...
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
(setq k (1+ k))
....
Chúc bạn thành công
  • 1

#9 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 05 August 2011 - 03:19 PM

Mình đã thử code 1 đoạn xóa các text có giá trị 0% và góc 0 độ :

(defun c:loc ()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget "x" (list (cons 0 "TEXT") (cons 8 "ENTTNTHIETKE")))
k 0
tdoc (ssadd)
)
(while (< k (sslength ss))
(setq name (ssname ss k)
ent1 (entget name)
p1 (cdr (assoc 10 ent1))
goc (cdr (assoc 50 ent1))
nd (cdr (assoc 1 ent1))
)
(setq ent1 (entmod (subst (cons 41 0.8) (assoc 41 ent1) ent1)))
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
)
(setvar "osmode" oldos)
(command "undo" "e")
)
Nhưng chưa ổn. Lisp không chạy ?
Các bác xem giúp !

Chào bạn nguyenngocson, rất vui vì bạn tham gia vào đội ngũ lisper của diễn đàn.
Xin góp ý với bạn một vài ý sau:
1/- Đoạn code:
(while (< k (sslength ss))
(setq name (ssname ss k)
ent1 (entget name)
p1 (cdr (assoc 10 ent1))
goc (cdr (assoc 50 ent1))
nd (cdr (assoc 1 ent1))
)
(setq ent1 (entmod (subst (cons 41 0.8) (assoc 41 ent1) ent1)))
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
)

sẽ làm cho vòng lặp chạy không dừng lại được do không tìm thấy điều kiện kết thúc vòng lặp.
Do phía trên bạn đã (setq k 0) nên điều kiện (< k (sslength ss)) sẽ luôn thỏa mãn khi tồn tại tập chọn ss.
Để vòng lặp hoàn thiện và có thể kết thúc bạn phải bổ sung điều kiện của k sau mỗi bước lặp. Cụ thể trong trường hợp này bạn cần bổ sung hàm (setq k (1+ k)) vào sau khi kết thúc hàm if và trước khi đóng hàm while.
2/- Đoạn code: (setq ent1 (entmod (subst (cons 41 0.8) (assoc 41 ent1) ent1))) nên thay bằng: (entmod (setq ent1 (subst (cons 41 0.8) (assoc 41 ent1) ent1))) sẽ hợp lý hơn vì hàm entmod chỉ có chức năng cập nhật mới đối tượng.
3/- Đoạn code: (eq goc (/ (* 0 pi) 2)) có vẽ thừa hàm (/ (* 0 pi) 2). Sao bạn không dùng (eq goc 0 0.000001)
4/- Đoạn code:tdoc (ssadd) bạn cho vào làm chi mà chả thấy sử dụng đến????
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#10 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 05 August 2011 - 03:22 PM

(eq goc (/ (* 0 pi) 2)) => sao không đơn giản là 0 ??

Vì có chỗ góc là 270độ, 90độ nên mình viết như vậy.
Sau khi nghe ý kiến các bác em đã Code lại :
(defun c:loc ()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget "x" (list (cons 0 "TEXT") (cons 8 "ENTTNTHIETKE")))
k 0
)
(while (< k (sslength ss))
(setq name (ssname ss k)
ent1 (entget name)
p1 (cdr (assoc 10 ent1))
goc (cdr (assoc 50 ent1))
nd (cdr (assoc 1 ent1))
)
(entmod (setq ent1 (subst (cons 41 1) (assoc 41 ent1) ent1)))
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
(setq k (1+ k))
)
(setvar "osmode" oldos)
(command "undo" "e")
)
Nếu em muốn xóa cái mũi tên phía dưới 0% thì làm như nào ạ.Em mới code nên vấn đề này hơi khó.
Mong các bác code giúp
Thân !
  • 0

#11 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 05 August 2011 - 04:33 PM

Vì có chỗ góc là 270độ, 90độ nên mình viết như vậy.
Sau khi nghe ý kiến các bác em đã Code lại :

(defun c:loc ()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget "x" (list (cons 0 "TEXT") (cons 8 "ENTTNTHIETKE")))
k 0
)
(while (< k (sslength ss))
(setq name (ssname ss k)
ent1 (entget name)
p1 (cdr (assoc 10 ent1))
goc (cdr (assoc 50 ent1))
nd (cdr (assoc 1 ent1))
)
(entmod (setq ent1 (subst (cons 41 1) (assoc 41 ent1) ent1)))
(if (and (eq nd "0%") (eq goc (/ (* 0 pi) 2)))
(command "erase" (ssname ss k) "")
)
(setq k (1+ k))
)
(setvar "osmode" oldos)
(command "undo" "e")
)
Nếu em muốn xóa cái mũi tên phía dưới 0% thì làm như nào ạ.Em mới code nên vấn đề này hơi khó.
Mong các bác code giúp
Thân !


Bạn cứ ssget lọc các mũi tên theo layer ra, thực hiện vòng lặp
Lấy tọa độ 2 diểm của leader (POLYLINE) và kiểm tra nếu góc = 0 độ (hoặc = pi()) thì xóa
:rolleyes:
  • 0

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

ttps://www.facebook...etThietKeTuDong


#12 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 05 August 2011 - 05:09 PM

Vì có chỗ góc là 270độ, 90độ nên mình viết như vậy.
Sau khi nghe ý kiến các bác em đã Code lại :

Nếu em muốn xóa cái mũi tên phía dưới 0% thì làm như nào ạ.Em mới code nên vấn đề này hơi khó.
Mong các bác code giúp
Thân !

Hề hề hề,
Bạn có thể tham khảo đoạn code sau mình viết để xóa các đối tượng theo yêu cầu trên bản vẽ bạn đã gửi:
[codebox]
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#13 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 05 August 2011 - 05:27 PM

Vì có chỗ góc là 270độ, 90độ nên mình viết như vậy.
Sau khi nghe ý kiến các bác em đã Code lại :

Nếu em muốn xóa cái mũi tên phía dưới 0% thì làm như nào ạ.Em mới code nên vấn đề này hơi khó.
Mong các bác code giúp
Thân !

Hề hề hề,
Bạn có thể tham khảo đoạn code sau mình viết để xóa các đối tượng theo yêu cầu trên bản vẽ bạn đã gửi:


(defun c:xoa ()
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq *h 0.5)
(setq h (getreal "\n Nhap khoang cach tu text toi arrow: "))
(if (> h 0) (setq *h h) (setq h *h))
(setq ss (ssget (list (cons 0 "text") (cons 1 "0%,1:1,1:0,66.67%") (cons 8 "enttnthietke,ENTTNTHIETKE1"))))
(setq ssl (acet-ss-to-list ss))
(foreach en ssl
(setq plst (acet-ent-geomextents en))
(setq plst (mapcar '(lambda (x) (trans x 0 1)) plst ))
(setq ss1 (ssget "w" (list (- (caar plst) h) (- (cadar plst) h) (caddar plst))
(list (+ (caadr plst) h) (+ (cadadr plst) h) (caddr (cadr plst)))
(list (cons 0 "polyline") (cons 8 "enttnthietke"))))
(setq ss1l (acet-ss-to-list ss1))
(foreach en1 ss1l
(setq ss (ssadd en1 ss))
)
)
(command "erase" ss "")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)


Bạn lưu ý rằng trong lísp trên mình có sử dụng hàm (setq plst (acet-ent-geomextents en)). Hàm này trả về danh sách gồm 2 điểm góc dưới trái và góc trên phải của khung bao đối tượng trong hệ tọa độ tuyệt đối (tức hệ World)
Do bản vẽ bạn đang để ở hệ tọa độ người dùng (hệ User) nên mình phải dùng (setq plst (mapcar '(lambda (x) (trans x 0 1)) plst )) để chuyển các tọa độ tuyệt đối về tọa độ người dùng cho phù hợp với bản vẽ của bạn.
Bạn cũng có thể chuyển trước bản vẽ của bạn về hệ tọa độ tuyệt đối (World) bằng hàm (command "ucs" "W") rồi mới thực hiện các bước chọn đối tượng trong tập ss1 cũng được.

Trên bản vẽ của bạn, các text 1:0 và 1:1 là nằm trên lớp enttnthietke1 chứ không phải enttnthietke đâu.
Hy vọng rằng lisp trên sẽ giúp bạn giải quyết tốt cái lisp bạn cầ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.

#14 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 05 August 2011 - 10:35 PM

Hề hề hề,
Bạn có thể tham khảo đoạn code sau mình viết để xóa các đối tượng theo yêu cầu trên bản vẽ bạn đã gửi:



(defun c:xoa ()
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq *h 0.5)
(setq h (getreal "\n Nhap khoang cach tu text toi arrow: "))
(if (> h 0) (setq *h h) (setq h *h))
(setq ss (ssget (list (cons 0 "text") (cons 1 "0%,1:1,1:0,66.67%") (cons 8 "enttnthietke,ENTTNTHIETKE1"))))
(setq ssl (acet-ss-to-list ss))
(foreach en ssl
(setq plst (acet-ent-geomextents en))
(setq plst (mapcar '(lambda (x) (trans x 0 1)) plst ))
(setq ss1 (ssget "w" (list (- (caar plst) h) (- (cadar plst) h) (caddar plst))
(list (+ (caadr plst) h) (+ (cadadr plst) h) (caddr (cadr plst)))
(list (cons 0 "polyline") (cons 8 "enttnthietke"))))
(setq ss1l (acet-ss-to-list ss1))
(foreach en1 ss1l
(setq ss (ssadd en1 ss))
)
)
(command "erase" ss "")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)


Bạn lưu ý rằng trong lísp trên mình có sử dụng hàm (setq plst (acet-ent-geomextents en)). Hàm này trả về danh sách gồm 2 điểm góc dưới trái và góc trên phải của khung bao đối tượng trong hệ tọa độ tuyệt đối (tức hệ World)
Do bản vẽ bạn đang để ở hệ tọa độ người dùng (hệ User) nên mình phải dùng (setq plst (mapcar '(lambda (x) (trans x 0 1)) plst )) để chuyển các tọa độ tuyệt đối về tọa độ người dùng cho phù hợp với bản vẽ của bạn.
Bạn cũng có thể chuyển trước bản vẽ của bạn về hệ tọa độ tuyệt đối (World) bằng hàm (command "ucs" "W") rồi mới thực hiện các bước chọn đối tượng trong tập ss1 cũng được.

Trên bản vẽ của bạn, các text 1:0 và 1:1 là nằm trên lớp enttnthietke1 chứ không phải enttnthietke đâu.
Hy vọng rằng lisp trên sẽ giúp bạn giải quyết tốt cái lisp bạn cần.

Trước hết cám ơn "phamthanhbinh" rất nhiều. Lisp đã tương đối ổn. Chỉ có điều: mình check với bản vẽ gửi lên thì oke. Trong trường hợp bản vẽ gồm nhiều trắc ngang như trên, lisp sẽ xóa cả cái mũi tên bên dưới số 4%. Em để file đính kèm, bác check giúp em ?
Hàm này trả về danh sách gồm 2 điểm góc dưới trái và góc trên phải của khung bao đối tượng trong hệ tọa độ tuyệt đối (tức hệ World).Nếu khi zom màn hình to lên rồi select sẽ không bị lỗi. Nếu chọn khi khung màn hình nhỏ lại sẽ bị lỗi. Có cách nào để sửa lỗi này ?
Cám ơn!
File:
  • 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 06 August 2011 - 02:21 AM

Trước hết cám ơn "phamthanhbinh" rất nhiều. Lisp đã tương đối ổn. Chỉ có điều: mình check với bản vẽ gửi lên thì oke. Trong trường hợp bản vẽ gồm nhiều trắc ngang như trên, lisp sẽ xóa cả cái mũi tên bên dưới số 4%. Em để file đính kèm, bác check giúp em ?
Hàm này trả về danh sách gồm 2 điểm góc dưới trái và góc trên phải của khung bao đối tượng trong hệ tọa độ tuyệt đối (tức hệ World).Nếu khi zom màn hình to lên rồi select sẽ không bị lỗi. Nếu chọn khi khung màn hình nhỏ lại sẽ bị lỗi. Có cách nào để sửa lỗi này ?
Cám ơn!
File:

Hề hề hề,
Không phải đâu là không phải đâu.
Sở dĩ cái mũi tên dưới số 4% của bạn bị mất là do bạn nhập cái khoảng cách từ text tới arrow quá lớn đấy thôi. Do vậy khi lấy vùng chọn nó ôm cả cái mũi tên ấy vào và xóa béng đi một lượt bạn ạ. Mình đã test thử bản vẽ bạn gửi với khoảng cách nhập vào là 0.3 thì nó chả bị sao hết, xóa ngon như bạn muốn.
Để tránh trường hợp này bạn có thể thay vì nhập khoảng cách, bạn cho chọn một text chuẩn và lấy chiều cao text làm cái khoảng cách ấy sẽ tốt hơn bạn ạ.
Hoặc là bạn chuyển hệ tọa độ về World trước khi chọn đối tượng như bài trước mình đã post.
Chúc bạn vui.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#16 leejang

leejang

    biết lệnh move

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

Đã gửi 06 August 2011 - 07:06 AM

Hề hề hề,
Không phải đâu là không phải đâu.
Sở dĩ cái mũi tên dưới số 4% của bạn bị mất là do bạn nhập cái khoảng cách từ text tới arrow quá lớn đấy thôi. Do vậy khi lấy vùng chọn nó ôm cả cái mũi tên ấy vào và xóa béng đi một lượt bạn ạ. Mình đã test thử bản vẽ bạn gửi với khoảng cách nhập vào là 0.3 thì nó chả bị sao hết, xóa ngon như bạn muốn.
Để tránh trường hợp này bạn có thể thay vì nhập khoảng cách, bạn cho chọn một text chuẩn và lấy chiều cao text làm cái khoảng cách ấy sẽ tốt hơn bạn ạ.
Hoặc là bạn chuyển hệ tọa độ về World trước khi chọn đối tượng như bài trước mình đã post.
Chúc bạn vui.

Hề hề. Lisp này quả thật rất ứng dụng cho dân thiết kế đường. Thanks các bác rất nhiều nhé ! kekeke. h thì đỡ phải xoá thủ công mất time rùi.
  • 0

#17 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 06 August 2011 - 07:31 AM

Hề hề hề,
Không phải đâu là không phải đâu.
Sở dĩ cái mũi tên dưới số 4% của bạn bị mất là do bạn nhập cái khoảng cách từ text tới arrow quá lớn đấy thôi. Do vậy khi lấy vùng chọn nó ôm cả cái mũi tên ấy vào và xóa béng đi một lượt bạn ạ. Mình đã test thử bản vẽ bạn gửi với khoảng cách nhập vào là 0.3 thì nó chả bị sao hết, xóa ngon như bạn muốn.
Để tránh trường hợp này bạn có thể thay vì nhập khoảng cách, bạn cho chọn một text chuẩn và lấy chiều cao text làm cái khoảng cách ấy sẽ tốt hơn bạn ạ.
Hoặc là bạn chuyển hệ tọa độ về World trước khi chọn đối tượng như bài trước mình đã post.
Chúc bạn vui.

Em đã thử nhưng đúng trong 1 số trường hợp cái khung bao vùng lọc rộng ?
Nếu em thêm đoạn code lọc toàn bộ text :
(setq ss (ssget "x" (list (cons 0 "text") (cons 1 "0%,1:1,1:0,66.67%") (cons 8 "enttnthietke,ENTTNTHIETKE1"))))
Lỗi gặp khi check với file mình gủi:
Command: ucs
Current ucs name: *WORLD*
Specify origin of UCS or [Face/NAmed/OBject/Previous/View/World/X/Y/Z/ZAxis]
<World>: w

Command: z
ZOOM
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: a

Command: xoa
undo Current settings: Auto = On, Control = All, Combine = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
<1>: be
Command:
Nhap khoang cach tu text toi arrow: 0.3
erase
Select objects: 56 found

Select objects:
Command: undo Current settings: Auto = On, Control = All, Combine = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
<1>: e

Sẽ xoá tất cả mũi tên ????
Theo em nên kiểm tra góc của mũi tên so với góc của text để lọc xóa ?
Bạn kiểm tra giúp ?
Thân !
  • 0

#18 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 06 August 2011 - 08:34 AM

.....
Sẽ xoá tất cả mũi tên ????
Theo em nên kiểm tra góc của mũi tên so với góc của text để lọc xóa ?
Bạn kiểm tra giúp ?
Thân !

- Ssget phụ thuộc vào view. Vì vậy, với mỗi text đang xét, bạn có thể view đến nó
- Chú ý rằng SSget ss1 của bác Bình tạo ra 1 box theo phương x,y, trên thực tế với text nghiêng thì box của bạn có thể cần phải "nghiêng"
- Để kiểm tra Pline bạn cần bổ sung hàm kiểm tra Thỏa mãn điều kiện kiểu như :

(defun check_pline (pline Text / return)
(list_đỉnh = (acet-geom-vertex-list Pline)
(số đỉnh Pline = (length lst_đỉnh))
(góc Pline chung = góc (car list_đỉnh) (last list_đỉnh))
(góc Text = dxf 50 text)
(nếu (số đỉnh Pline = 3 và góc Pline bằng hoặc lệch 180 với góc text) và điều kiện j đó => (return = T)
(không thì return = nil)
)
return
)

và thêm vào vòng lặp foreach kiểu kiểu như thế này :

(setq k 0)
(foreach text Tập_Text
(lấy Tập_Pline thuộc box ảo của 1 text)
(While (and (<> Thoát 1)(< k (length Tập_Pline)) ;Kiểm tra thoát giữa chừng
(foreach Pline Tập_Pline
(cond
((not (check_Pline Pline text))(setq k (1+ k)) ;không thỏa mãn => không làm gì, chỉ tăng biến đếm
(T(Xóa Pline)(setq Thoát 1)) ;Thỏa mãn : xóa Pline và thoát vòng lặp ngay, vì với 1 text chỉ lấy 1 Pline
)
)
);end While

)

Chúc bạn hiện thực hóa code thành công :)
  • 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


#19 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 06 August 2011 - 09:10 AM

Cám ơn "ketxu". Minh đang thử xem kiểu code trên để áp vào code mình. Quả thực mình mới code lisp nên vẫn chưa hiểu làm như thế nào?Bạn đừng :D.
Thank !
  • 0

#20 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 06 August 2011 - 03:27 PM

Em đã thử nhưng đúng trong 1 số trường hợp cái khung bao vùng lọc rộng ?
Nếu em thêm đoạn code lọc toàn bộ text :

(setq ss (ssget "x" (list (cons 0 "text") (cons 1 "0%,1:1,1:0,66.67%") (cons 8 "enttnthietke,ENTTNTHIETKE1"))))
Lỗi gặp khi check với file mình gủi:
Command: ucs
Current ucs name: *WORLD*
Specify origin of UCS or [Face/NAmed/OBject/Previous/View/World/X/Y/Z/ZAxis]
<World>: w

Command: z
ZOOM
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: a

Command: xoa
undo Current settings: Auto = On, Control = All, Combine = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
<1>: be
Command:
Nhap khoang cach tu text toi arrow: 0.3
erase
Select objects: 56 found

Select objects:
Command: undo Current settings: Auto = On, Control = All, Combine = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
<1>: e

Sẽ xoá tất cả mũi tên ????
Theo em nên kiểm tra góc của mũi tên so với góc của text để lọc xóa ?
Bạn kiểm tra giúp ?
Thân !

Hề hề hề, Thiệt tình mình cũng chả hiểu bạn làm ra sao nữa.
Việc thêm tham số "x" vào hàm ssget không hề làm thay đổi bản chất của việc chọn đối tượng cho tập chọn ss1 mà chỉ giúp bạn chọn tất cả các đối tượng thỏa mãn điều kiện lọc trên bản vẽ và không cần phải dùng selection nữa mà thôi.
Cái ảnh hưởng đến số đối tượng trong tập chọn ss1 chính là cái tham số khoảng cách từ text tới arrow mà bạn nhập vào. Nều con số này quá lớn thì vùng chọn sẽ lớn lên và vì thế nó ôm luôn các đối tượng khác nữa bạn ạ. Vì thế bạn cần lựa chọn giá trị cho phù hợp là Ok.
Thực tế với bản vẽ bạn post thì mình có thể chọn tới 0.5 nó vẫn chỉ xóa cái cần xóa mà khôn ảnh hưởng gì tới thằng 4% cả bạn ạ. (giá trị mình dim trên bản vẽ của bạn chỉ ~ 0.3 thôi)
Như đã post ở bài trước, bạn có thể thay việc nhập giá trị này bằng cách chọn một đối tựơng text phù hợp để lấy chiều cao của text đó làm giá trị khoảng cách thì sẽ đơn giản hơn khi nhập giá trị (Do bạn chửa biết giá trị nào là OK, mình thì chơi kiểu chuối là đo trước giá trị này để biết mà nhập).
Việc lọc các đối tượng polyline hoàn toàn có thể làm được, (theo góc hay theo số đỉnh, hay theo độ dài,...). Tuy nhiên vẫn phải tùy vào cái bản vẽ cụ thể của bạn vì có thể các polyline này có cấu tạo rất tùy tiện thì cũng hỏng.
Với cái bản vẽ bạn gửi thì mình thấy chả cần thiết làm thêm phần lọc này vì chỉ với điều kiện như mình đã làm cũng có thể thỏa mãn yêu cầu đặt ra rồi. Mình đả test với khá nhiều dạng lọc thì kết quả cũng chỉ như nhau mà thôi.
Rất có thể bạn áp dụng cái lisp này với những bản vẽ khá lớn, đến nỗi lúc này khoảng cách từ các mũi tên tới các text nhỏ hơn 0.3 rất rất nhiều nên mới bị tình trạng xóa sạch các mũi tên như vậy bạn ạ. Hãy thử kiểm tra lại bằng dim xem chúng là bao nhiêu bạn nhé. Khi đó bạn se nhập thử cái khoảng cách đó vào và chạy lisp coi sao nhé.
Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.