Chuyển đến nội dung
Diễn đàn CADViet
kycuckeo

LISP KIỂM TRA CÁC TEXT TRÙNG NỘI DUNG!

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

Hiện mình đang có bản vẽ chứa các text số liệu (Text_DanhBo). Mình muốn kiểm tra xem các text này hiện có trùng nhau về nội dung hay ko (vì đây là số liệu cập nhật ở ngoài hiện trường nên mình cần kiểm tra). Mình gửi các bạn file đính kèm có chứa Layer text: "Text_DanhBo". Xin nhờ các cao thủ trợ giúp! Thanks all!.

http://www.cadviet.com/upfiles/3/27516_an_khanh.dwg

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 dùng cái này. Những text nào trùng nhau thì nó chuyển sang layer 0 và đổi màu theo từng cặp.

Chỉ cần đánh lệnh thôi. Cuối lệnh nó sẽ ghi lên dòng command những cái trùng nhau.

 

(defun c:dem(/ l0 l1 ss n)
  (setvar 'cmdecho 0)
  (setq ss (ssget "X" '((0 . "TEXT")(1 . "~*[~-.0-9]*")))
l0 (vl-remove-if-not '(lambda (x) (= 11 (strlen (cdr (assoc 1 (entget x))))))
    (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
l1 nil
  )
  (mapcar '(lambda(x) (if (setq pair (assoc (setq chu (cdr (assoc 1 (entget x)))) l1))
(setq l1 (subst (cons chu (1+ (cdr pair))) pair l1))
(setq l1 (cons (cons chu 1) l1)))) l0)
  (setq l1 (vl-remove-if '(lambda (x) (= (cdr x) 1)) l1)
n 0)
  (foreach v l1
    (command "change" (ssget "X" (list '(0 . "TEXT") (cons 1 (car v)))) ""
    "P" "LA" "0" "C" (itoa (setq n (1+ n))) ""))
  (setvar 'cmdecho 1) (princ l1) (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

Cám ơn bạn, bạn thật khiêm tốn và ham học, chắc chắn sẽ tiến xa.

 

Cảm ơn anh. Em học nhiều thứ từ anh. Hii

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, bạn thật khiêm tốn và ham học, chắc chắn sẽ tiến xa.

Em luôn đọc những bài anh viết. Hii.

Của cả bác Hạ, ketxu, Gia_Bách, NguyenHoanh, Phamthanhbinh...

Em tự học nên mót dần dần anh ạ. Hii

Chúc anh sức khỏe 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

Nói chung công thức của người viết code (bất kỳ ngôn ngữ nào, không riêng gì lisp) là:

Học từ người khác + Tư duy của chính mình + đam mê + một chút năng khiếu = Thành cô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ũng nhân tiện đây em hỏi về 1 chút Vla-

1. Sau khi quét tất cả các TEXT: (setq ss (ssget (list (cons 0  "TEXT"))))

em sử dụng 1 hàm lọc Text là số như sau:

(defun ChonTextSo (ss / ss i ent str ss1) 
    (progn
      (setq i	0
	    ss1	(ssadd)
      )
      (repeat (sslength ss)
	(setq ent (ssname ss i)
	      str (cdr(assoc 1 (entget ent)))
	      i	  (+ 1 i)
	)
	(if (distof str 2)
	  (ssadd ent ss1)
	)
      )
      (if (> (sslength ss1) 0)
	ss1
      )      
    )
)

(setq ss1 (ChonTextSo ss))

 

Nếu em sử dụng cũng kiểu dạng cấu trúc như này:

(vlax-for e (vla-get-activeSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
  	(setq pg (vlax-get e 'InsertionPoint))
   	(vla-move e (vlax-3d-point pg) (vlax-3d-point (vlax-curve-getClosestPointTo obj pg T)))
)

thì làm sao cái đoạn (vlax-for e (vla-get-activeSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))) nó hiểu là của thằng ss1. Có phải cái đoạn đó chỉ có tác dụng với những đối tượng ssget vừa quét?

 

2. Nếu sử dụng các hàm vla-, vlax-...thì làm sao em truy xuất được các thông tin của đối tượng đó: Ví dụ như Nội dung của Text, chiều cao text, layer, màu sắc.....

(Giống như entget ename mà nó liệt kê toàn bộ thông tin đối tượng)

Em thì vẫn làm theo cách cơ bản

(foreach item (acet-ss-to-list ss1)
    Có thể sử dụng vlax-ename->vla-object item  để sử dụng các hàm VLA- VLAX-....
    Còn lại vẫn sử dụng các hàm bình thường
)

 

Rất mong nhận được lời giải đáp của các bác.

Em sẽ học hỏi các bác dần dầ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
Vào lúc 28/8/2014 tại 21:28, Tot77 đã nói:

Bạn dùng cái này. Những text nào trùng nhau thì nó chuyển sang layer 0 và đổi màu theo từng cặp.

Chỉ cần đánh lệnh thôi. Cuối lệnh nó sẽ ghi lên dòng command những cái trùng nhau.

 


(defun c:dem(/ l0 l1 ss n)
  (setvar 'cmdecho 0)
  (setq ss (ssget "X" '((0 . "TEXT")(1 . "~*[~-.0-9]*")))
l0 (vl-remove-if-not '(lambda (x) (= 11 (strlen (cdr (assoc 1 (entget x))))))
    (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
l1 nil
  )
  (mapcar '(lambda(x) (if (setq pair (assoc (setq chu (cdr (assoc 1 (entget x)))) l1))
(setq l1 (subst (cons chu (1+ (cdr pair))) pair l1))
(setq l1 (cons (cons chu 1) l1)))) l0)
  (setq l1 (vl-remove-if '(lambda (x) (= (cdr x) 1)) l1)
n 0)
  (foreach v l1
    (command "change" (ssget "X" (list '(0 . "TEXT") (cons 1 (car v)))) ""
    "P" "LA" "0" "C" (itoa (setq n (1+ n))) ""))
  (setvar 'cmdecho 1) (princ l1) (princ)
)

Chào bác, em có tải lisp về dùng nhưng nhập lệnh nó hiện ra "; error: bad argument type: lselsetp nil" rồi thôi

Bác sửa giúp em với ạ, em cảm ơ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

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

×