Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
7 replies to this topic

#1 kycuckeo

kycuckeo

    biết vẽ circle

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

Đã gửi 28 August 2014 - 03:43 PM

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.c...16_an_khanh.dwg


  • 0
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+
"NEVER BACK DOWN"

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 28 August 2014 - 09:28 PM

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

  • 2

#3 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 29 August 2014 - 12:20 AM

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


  • 1



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#4 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 29 August 2014 - 07:32 AM

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


  • 0

#5 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 29 August 2014 - 08:21 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#6 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 29 August 2014 - 08:31 AM

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.


  • 1

#7 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 29 August 2014 - 08:51 AM

:wub: . Dạ. Em cũng nghĩ như vậy ạ. Hiii

Cảm ơn lời khuyên của anh


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#8 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 29 August 2014 - 09:52 AM

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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn