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

Xin lisp về đếm block

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

Mình đang làm công việc thiết kế các loại bàn ghế, trong đó dùng rất nhiều các loại khớp nối có thứ tự từ HJ1 - > HJ10, và nhiều phụ kiện khác .Mỗi lần vẽ xong mình phải dùng lệnh bcount để đếm từng loại nhưng phải nhấn F2 mới thấy được hết số lượng mấy thứ đó trên Autocad Text Window nên rất mất thời gian,.Xin viết giùm mình lisp theo ý sau: chọn tất cả các đối tượng cần tính toán, sau đó lisp tự thống kê số lượng của từng loại và in ra file text xuất hiện ngay trên màn hình giống như Autocad Text Window.Nếu cần thêm thông tin gì để viết được Lisp này xin mọi người cứ yêu cầu.Xin cảm ơn mọi người.

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
Mình đang làm công việc thiết kế các loại bàn ghế, trong đó dùng rất nhiều các loại khớp nối có thứ tự từ HJ1 - > HJ10, và nhiều phụ kiện khác .Mỗi lần vẽ xong mình phải dùng lệnh bcount để đếm từng loại nhưng phải nhấn F2 mới thấy được hết số lượng mấy thứ đó trên Autocad Text Window nên rất mất thời gian,.Xin viết giùm mình lisp theo ý sau: chọn tất cả các đối tượng cần tính toán, sau đó lisp tự thống kê số lượng của từng loại và in ra file text xuất hiện ngay trên màn hình giống như Autocad Text Window.Nếu cần thêm thông tin gì để viết được Lisp này xin mọi người cứ yêu cầu.Xin cảm ơn mọi người.

dùng attribute extraction(tools =>attribute extraction)

nếu chưa đúng thi bạn có thể up một acad file lên diễn đà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

Minh mò hoài mà sao chả làm được gì cả, căn bản là tiếng anh của minh yếu quá, bạn có thể hướng dẫn cụ thể cho mình được khô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
Sao không ai hồi âm vậy?Có ai giúp minh với!!!!!

Mình làm với cad 2007:

TOOLS => attribute extraction : gồm 6 bước:(6 page)

page 1: chọn Create table .....(use templete: chọn cái này nếu bạn có khung sẵn) => next

page 2: chọn select objects nếu chỉ chọn một khu vực nào đó(còn chọn hết bản vẽ thì chọn current drawing)=> next

page 3: muốn xuất cái gì thì chọn cái đó ... =>next

page 4: chọn autocad table(chọn thêm externel file nếu muốn xuất ra excel)=> next

page 5: next

page 6: FINISH

  • 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

Mình đang làm công việc thiết kế các loại bàn ghế, trong đó dùng rất nhiều các loại khớp nối có thứ tự từ HJ1 - > HJ10, và nhiều phụ kiện khác .Mỗi lần vẽ xong mình phải dùng lệnh bcount để đếm từng loại nhưng phải nhấn F2 mới thấy được hết số lượng mấy thứ đó trên Autocad Text Window nên rất mất thời gian,.Xin viết giùm mình lisp theo ý sau: chọn tất cả các đối tượng cần tính toán, sau đó lisp tự thống kê số lượng của từng loại và in ra file text xuất hiện ngay trên màn hình giống như Autocad Text Window.Nếu cần thêm thông tin gì để viết được Lisp này xin mọi người cứ yêu cầu.Xin cảm ơn mọi người.

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)

)

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

  • Like 2
  • Vote tăng 10

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
Phải công nhận, bác ssg hết chỗ chê, cảm ơn bác thật thật nhiều,còn hơn cả mong đợi nữa :cheers:

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ì.

  • Like 1
  • 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ác bác cho em hỏi tí, ngôn ngữ trong kết quả tìm được khi hiên ở notepad có thể đọc được tiếng anh, tiếng trung không vậy, ý em hỏi là khi bản vẽ của người nước ngoài thiết kê (ở cty em là của mấy anh KS Trung Quốc họ đặt tên cho block bằng chữ TQ, khi được kết quả thì bị vỡ font gây khó khăn cho việc tìm kết quả, đặc biệt là khi tìm block có số lượng gần giống nhau), mong các bác giúp đỡ. Thật ra đi làm em mới tìm hiểu nhiều về lĩnh vực autolisp, nó hay thật đấy.

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ác bác cho em hỏi tí, ngôn ngữ trong kết quả tìm được khi hiên ở notepad có thể đọc được tiếng anh, tiếng trung không vậy, ý em hỏi là khi bản vẽ của người nước ngoài thiết kê (ở cty em là của mấy anh KS Trung Quốc họ đặt tên cho block bằng chữ TQ, khi được kết quả thì bị vỡ font gây khó khăn cho việc tìm kết quả, đặc biệt là khi tìm block có số lượng gần giống nhau), mong các bác giúp đỡ. Thật ra đi làm em mới tìm hiểu nhiều về lĩnh vực autolisp, nó hay thật đấy.

Bạn có thể sử dụng lệnh Rename của CAD để đổi tên Block đó về theo ý của mình nhằm thuận lợi hơn trong công việc tìm kiếm và sử dụ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
Bạn có thể sử dụng lệnh Rename của CAD để đổi tên Block đó về theo ý của mình nhằm thuận lợi hơn trong công việc tìm kiếm và sử dụng

Cảm ơn các bác nhé. Tiện đây em cũng xin hỏi các bác, em đã lục tung dd rồi nhưng không thấy, tức là thế này, em có một bản vẽ mà người thiết kế hình như không dung block (hay là ẩn hiện gì thì em chưa biết), làm cho em sử dụng lisp đếm block (để đếm thiết bị) không thể dùng được, làm thế nào bây giờ hả các bác, có cách nào để biến các thiết bị đó thành block không vậy.

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 các bác nhé. Tiện đây em cũng xin hỏi các bác, em đã lục tung dd rồi nhưng không thấy, tức là thế này, em có một bản vẽ mà người thiết kế hình như không dung block (hay là ẩn hiện gì thì em chưa biết), làm cho em sử dụng lisp đếm block (để đếm thiết bị) không thể dùng được, làm thế nào bây giờ hả các bác, có cách nào để biến các thiết bị đó thành block không vậy.

Không có bác nào có ý kiến gì ah

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
Không có bác nào có ý kiến gì ah

Bạn hãy upload bản vẽ đó lên đây mới có cách giải quyết đượ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
Bạn hãy upload bản vẽ đó lên đây mới có cách giải quyết được.

Các bác thông cảm nhé, em không up lên được, chỉ biết là mấy ông KS bên nước bạn (TQ) họ vẽ mấy cái thiết bị như bóng đèn, công tắc, ổ cắm họ không dùng block bình thường làm em dùng lisp đếm block không thể nào đếm được. Dạng như họ vẽ một thiết bị chuẩn rồi dùng lệnh copy thì phải

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

 

Rất cám ơn, bài viết của bạn rất có ích cho mọi người

  • 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

- Bạn nhìn xuống bên dưới bài bạn, mục Similar Post có kha khá link về vấn đề này rồi.Lần sau nhớ chú ý hơn bạn nhé.

- Bạn nói không đếm được chắc là dùng Bcount, và chưa thử các công cụ lọc qselect, fi của CAD.

- Nếu muốn dùng lisp thì bạn qua đây :

DB

  • 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

mình muốn xin lisp về lệnh bcount chứ không phải db ai giúp minh với

Thật khó hiểu!

Bcount nằm trong bộ Express, nếu máy bạn có rồi thì xin cái gì ở đây ??

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

CAD của bạn đã cài bộ Express Tool ra chưa, bạn dùng CAD nào ? Thường thì cài bộ cài CAD sẽ có mục cho bạn lựa chọn cài thêm Express, và nếu đã cài thì thường sẽ có menu Express hiện ra. Bạn chịu khó miêu tả kỹ để mọi người dễ dàng giúp đỡ bạn hơ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

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

thanks

Hề hề hề,

Code nháp cho bạn xem có đúng ý không nhé:

(defun c:datbl ()
(setq n (sslength (ssget (list (cons 0 "insert") (cons 66 1)))))
(alert (strcat "\n Ban vua chon duoc " (rtos n 2 0) " block co chua thuoc tinh"))
(princ)
)

Chúc bạn vui.

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 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 thấy lips này vẫn khá thủ công. Bạn có thể chỉnh sửa làm sao để chọn vào một block mẫu mà mình cần thống kê thì nó sẽ đếm tất cả block giống nó trên bản vẽ được không? (Ứng dung như khi cần thống kê cửa đi, cửa sổ...)

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
(defun C:DEM ()
(alert (strcat "\nTren ban ve co " (itoa (sslength (ssget "X" (list (cons 0 "insert") (assoc 2 (entget (car (entsel "\nChon Block mau: ")))))))) " block giong block mau.")))

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

×