Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
ttmt_jses

Xin lisp về đếm block

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

lp_hai    207

mình cần đếm block attribute có ai biết cách không chỉ mình với

thanks

Đếm block ATT thì đa dạng lắm,

1)có thể bạn chỉ cần đếm số lượng block mà không quan tâm đến nội dung của ATT VD: không cần phân biệt cửa D1 với D2 mà chỉ cần biết nó có block name là "Door"

2)hoặc bạn muốn đếm có bao nhiêu D1 và bao nhiêu D2? ở trường hợp này bạn cần phải cho người viết lisp biết block của bạn như thế nào, có mấy ATT....

 

bạn cần nói rõ yêu cầu của mình!

Nếu là yêu cầu như trường hợp 1 bạn có thể dùng thử lisp này, nó tương tự như lệnh slect similar, các đối tượng cùng kiểu, cùng layer thì nó sẽ chọn hết.

(defun c:sw(/ aaa ls dt dt1 sdt sdt1 ent ent1 id id1)
 (setq AAA(SSGET)
sdt (sslength AAA)
id 0
dt (ssadd)
)
 (repeat sdt;;repeat1
(setq ent (ssname AAA id)
id (1+ id)
);;setq
(setq ls (entget ent))
(if (= (cdr (assoc 0 ls)) "INSERT")
 	(get-block ent)
 	(setq dt1(ssget"all"(list(assoc 0 ls) (assoc 8 ls))))
 	);;if
(setq sdt1 (sslength dt1)
  id1 -1)
(while (setq ent1(ssname dt1 (setq id1 (1+ id1))))
 	(setq dt (ssadd ent1 dt))
 	);;While
(sssetfirst dt dt)  
);;repeat1
 (princ (strcat "\nco " (rtos (sslength dt)) " doi tuong." ))
 (princ)
 )
;;;;;;;;;;;;;;;;;;;;;;;;
(defun get-block(entm / sdtb idb ent2 entb dtm namem name BBB entb)
 (setq dtm (vlax-ename->vla-object entm))
 (setq namem (if(vlax-property-available-p dtm 'effectivename)
  (vla-get-effectivename dtm)
  (vla-get-name dtm)
  ));;;
 (setq BBB(SSGET "all" (list(cons 0 "INSERT") (assoc 8 (entget entm))))
sdtb (sslength BBB)
idb 0
dt1 (ssadd)
)
 (repeat sdtb;;repeat
(setq entb (ssname BBB idb)
idb (1+ idb)
)
(setq ent2(vlax-ename->vla-object entb))
(setq name (if(vlax-property-available-p ent2 'effectivename)
  (vla-get-effectivename ent2)
  (vla-get-name ent2)
  ))
(if (= name namem)
 	(setq dt1 (ssadd entb dt1))
 	)
);;repeat
 )

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
lp_hai    207

Sao mà dài thế! #25 cũng được mà

Đúng là lisp ở #25 đếm att được, nhưng em test với bản vẽ mà bạn ấy đưa lên thì không được bác ah, vì att cũng có thể bao gồm cả Dynamic block bác ah, Lisp này em viết để dùng chọn nhiều loại đối tượng cùng lúc nên hơi dài. Thấy có vẽ dùng được cho yêu cầu của bạn ấy nên em bê nguyên con lê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
hangcom    0

 

Bạn dùng thử lisp này. Lệnh DB, nó chạy y như ý bạn muốn:

 

;;;------------------------------------------------(defun ss2ent(ss / sodt index ent lstent)(setq    sodt (if ss (sslength ss) 0)    index 0)(repeat sodt    (setq        ent (ssname ss index)        index (1+ index)        lstent (cons ent lstent)    ))(reverse lstent));;;------------------------------------------------(defun C:DB( / ss Le fn f e Le Ln Bn old X Res) ;;;Dem so luong Blocks(setq    ss (ssget '((0 . "INSERT")))    Le (ss2ent ss)    fn (getfiled "Save As" "" "txt" 1)    f (open fn "w"))(foreach e Le (setq Ln (append Ln (list (cdr (assoc 2 (entget e)))))))(foreach Bn Ln    (if (setq old (assoc Bn Res))        (setq Res (subst (cons bn (1+ (cdr old))) old Res))        (setq Res (append Res (list (cons Bn 1))))    ))(princ "KET QUA:\n\n" f)(foreach X Res  (princ (strcat (car X) " = " (itoa (cdr X)) "\n") f))(close f)(startapp "notepad" fn) (princ));;;------------------------------------------------

Mình sử dụng Autocad 2008, mình đã sử dụng lệnh AP và nó báo đã load nhưng khi mình gõ lệnh ĐB nó không dùng được. nó báo:

Unknown command "DB".  Press F1 for help.

Bạn hãy cho mình hướng khắc phục lỗi này. 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
minhtu2004    35

Bạn dùng thử lisp này. Lệnh DB, nó chạy y như ý bạn muốn:

 


;;;------------------------------------------------

(defun ss2ent(ss / sodt index ent lstent)

(setq

sodt (if ss (sslength ss) 0)

index 0

)

(repeat sodt

(setq

ent (ssname ss index)

index (1+ index)

lstent (cons ent lstent)

)

)

(reverse lstent)

)

;;;------------------------------------------------

(defun C:DB( / ss Le fn f e Le Ln Bn old X Res) ;;;Dem so luong Blocks

(setq

ss (ssget '((0 . "INSERT")))

Le (ss2ent ss)

fn (getfiled "Save As" "" "txt" 1)

f (open fn "w")

)

(foreach e Le (setq Ln (append Ln (list (cdr (assoc 2 (entget e)))))))

(foreach Bn Ln

(if (setq old (assoc Bn Res))

(setq Res (subst (cons bn (1+ (cdr old))) old Res))

(setq Res (append Res (list (cons Bn 1))))

)

)

(princ "KET QUA:\n\n" f)

(foreach X Res (princ (strcat (car X) " = " (itoa (cdr X)) "\n") f))

(close f)

(startapp "notepad" fn)

(princ)

)

;;;------------------------------------------------

-Nhờ bạn viết thêm code tạo bảng table để chèn kết quả vào, thank.Bảng thống kê như sau:

Untitled_zpse5cefacc.jpg

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

Mình sử dụng lisp của bác ssg.Lỗi:"Command: db, 420 found; error: bad argument type: FILE nil". Tạo file cad mới thì sử dụng được. Nhưng mở bản vẽ của người khác đưa thì không sử dụng lisp "db" được. Mình chưa khắc phục đượ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
SƠN MÈO    1

Không cần phải khen! Bạn là thành viên mới, ssg xin lưu ý bạn vài điều:

 

1. Nếu cảm thấy một bài viết nào đó hay, hữu ích với mình, và nếu không có ý kiến gì khác, bạn chỉ cần bấm vào nút "Thanks" ở dưới bài viết đó. Số lần được thanks của một thành viên sẽ được thống kê tự động và được ghi ở phần thông tin về thành viên bên trái bài viết, sau dấu : và trước dấu *. Con số ấy phần nào ghi nhận sự đóng góp của thành viên đó đối với diễn đàn, có tác dụng động viên người viết bài tốt hơn là những lới khen chung chung.

 

2. Trước khi nêu yêu cầu, bạn nên dùng chức năng "Tìm kiếm" của diễn đàn. Thật ra thì lisp đếm block đã được anh Hoành post ở topic "Viết lisp theo yêu cầu", trang 31. Tuy nhiên:

- Yêu cầu của bạn có hơi khác một chút: không cần xét tỷ lệ của block; ghi ra file *.txt và open nó

- Topic trên quá lớn, tìm được một nội dung trong đó quả thực rất khó và mất thời gian. Ngay cả ssg, dù biết rằng nó ở trang 31 (theo lời của 1 member khi ssg dùng chức năng tìm kiếm), nhưng phải lật trang đến... mỏi tay mới thấy!

Ssg đã dựa trên cái lisp của anh Hoành, sửa đổi, bổ sung một chút cho hợp với yêu cầu của bạn.

 

Nhân đây, ssg cũng đề nghị anh Hoành tách topic trên (cả cả một số topic khác nếu có số bài quá nhiều) thành nhiều topic con để các thành viên tiện theo dõi khi cần. Ngoài ra, nếu có thể được, anh bổ sung thêm chức năng "gõ con số 31 chẳng hạn, trình duyệt sẽ chuyển ngay đến trang 31 mà không cần phải lật trang nhiều lần". Biết là anh Hoành đang khá bận, chỉ lưu ý để anh xem xét.

 

 

P/S

(Dành cho các "lập trình viên" lisp)

 

Thuật toán đếm mà anh Hoành đã dùng thật tuyệt. Minh hoạ bằng đoạn code sau trong chương trình của ssg:

 

...
(foreach Bn Ln
(if (setq old (assoc Bn Res))
(setq Res (subst (cons bn (1+ (cdr old))) old Res))
(setq Res (append Res (list (cons Bn 1))))
)
)
...
Không chỉ để đếm block, các bạn có thể dùng thuật toán trên khi cần đếm bất cứ cái gì.

Thanks, bác có lisp đếm text thì cho em xin luôn ạ

  • 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

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


×