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

Nhờ các cao thủ viết hộ lisp đếm block động

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

Gửi các anh, chị trong diễn đàn.

Chả là em làm block động cho 1 vật thể nhưng khi sử dụng lệnh copy vật thể đó để tạo thành các đối tượng khác thì ko dùng được lệnh filter hay bcount của cad hoặc db.lsp để thống kê số lượng block vì khi copy nó sẽ hiểu là vật thể mới với tên khác (ví dụ tên là *U249 trong khi tên block khi tạo là EMERGENCY LIGHT (WITH SOCKET OUTLET).

Em Hoà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

Gửi các anh, chị trong diễn đàn

Vì vụ này hơi khó mô tả nền em attach file đính kèm để mọi người tiện tham khảo

http://www.cadviet.com/upfiles/3/file_cad_minh_hoa_lisp_dem_block_dong_1.dwg

trong file đính kèm có 2 block động được tạo ra từ 1 block lúc đầu bằng lệnh copy. Mục tiêu là đếm số lượng block trong hình vẽ cho kết quả là 3.

Em Hoà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

Bạn nên post file kèm block nên, vì ở máy mọi người có thể là không thế :)

 

P/S : nói xong thì bạn ấy post lên rồi, srr mọi ng ^^

 

P/S2 : kiểm tra file các block đếm bình thường, bcount có vẻ trục trặc với Dynamic Block, nhưng dùng qselect vẫn thấy ngon nghẻ, tên của block vẫn như cũ,k hề bị thay đổ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

Gửi các anh, chị trong diễn đàn

Vì vụ này hơi khó mô tả nền em attach file đính kèm để mọi người tiện tham khảo

http://www.cadviet.com/upfiles/3/file_cad_minh_hoa_lisp_dem_block_dong_1.dwg

trong file đính kèm có 2 block động được tạo ra từ 1 block lúc đầu bằng lệnh copy. Mục tiêu là đếm số lượng block trong hình vẽ cho kết quả là 3.

Em Hoàng

Cái này có thể sử dụng lệnh qselect được mà

qselect.jpg

Mình sẽ sửa lại Lisp sau của bác ssg để có thể thống kê được cả "Block động" nữa. Nhưng mình rất ngại khi bạn viết 2 từ "cao thủ" lắm. Lisp sau sẽ thống kê toàn bộ Block mà bạn chọn -> Kể cả Block hay Block động)

Đây là code

(defun ss2ent(ss / sodt index ent lstent)
(setq
   sodt (if ss (sslength ss) 0)
   index 0
)
(repeat sodt
   (setq
       ent (vlax-ename->vla-object (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
;copyright by SSG
;Develop by Tue_NV
(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 
     (if (vlax-property-available-p e 'EffectiveName)
(vla-get-EffectiveName e)
(vla-get-Name 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 1
  • Vote tăng 7

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

Gửi bạn Tuệ,

Rất cám ơn bạn nhưng có thể bạn chưa hiểu ý mình. Theo như lisp của bạn thì sẽ cho ra kết quả là *U253 = 1, *U252 = 1, *U249 = 1 trong khi tên ban đầu của block mình tạo ra là EMERGENCY LIGHT (WITH SOCKET OUTLET) và mong muốn kết quả là = 3. vì các 3 đối tượng trên là cùng 1 chủng loại thiết bị để làm báo giá.

Việc dùng Qselect cũng làm được nhưng không thể thống kê nhanh được tất cả số lượng các block có trong bản vẽ nếu có nhiều block động tên khác nhau. Mục đích là mình muốn db.lisp đếm được như block thông thường và in ra kết quả để nạp vào báo giá

Hoà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

Gửi bạn Tuệ,

Rất cám ơn bạn nhưng có thể bạn chưa hiểu ý mình. Theo như lisp của bạn thì sẽ cho ra kết quả là *U253 = 1, *U252 = 1, *U249 = 1 trong khi tên ban đầu của block mình tạo ra là EMERGENCY LIGHT (WITH SOCKET OUTLET) và mong muốn kết quả là = 3. vì các 3 đối tượng trên là cùng 1 chủng loại thiết bị để làm báo giá.

Việc dùng Qselect cũng làm được nhưng không thể thống kê nhanh được tất cả số lượng các block có trong bản vẽ nếu có nhiều block động tên khác nhau. Mục đích là mình muốn db.lisp đếm được như block thông thường và in ra kết quả để nạp vào báo giá

Hoàng

Lisp trên viết theo đúng yêu cầu như vậy cơ mà? Lisp sẽ thống kê toàn bộ Block mà bạn chọn (Block hoặc là Block động). Cũng có thể bạn dùng CAD với phiên bản trước CAD2008. Bạn sử dụng với CAD 2008 xem nhé. Tue_NV chưa có CAD 2007, CAD2006 để thử xem nó như thế nào? Mình bảo đảm Lisp chạy tốt với CAD2008 trở lên :)

Chắc là bạn cài CAD2007 hoặc CAD2006 phải không? Tui khuyên bạn nên cài luôn CAD2008 trở lên luôn đi vì CAD2008 trở lên có những tính năng mới mà CAD2007 trở xuống không có. Vậy nhé

 

Đây là kết quả khi chạy Lisp xong

 

KET QUA:

 

EMERGENCY LIGHT (WITH SOCKET OUTLET) = 3

  • 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

Gửi bạn Tuệ,

Đúng là mình đang dùng Cad2007. Mình đã cài thử phiên bản Cad 2010 (có sẵn bộ cài trong máy) nhưng khi sử dụng db.lsp thì báo lỗi sau:

Command: ap

APPLOAD db.lsp successfully loaded.

Command: db

Select objects: Specify opposite corner: 3 found

Select objects: ; error: no function definition: VLAX-ENAME->VLA-OBJECT

Bạn thử kiểm tra lại giúp mình xem

Hoà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

Gửi bạn Tuệ,

Đúng là mình đang dùng Cad2007. Mình đã cài thử phiên bản Cad 2010 (có sẵn bộ cài trong máy) nhưng khi sử dụng db.lsp thì báo lỗi sau:

Command: ap

APPLOAD db.lsp successfully loaded.

Command: db

Select objects: Specify opposite corner: 3 found

Select objects: ; error: no function definition: VLAX-ENAME->VLA-OBJECT

Bạn thử kiểm tra lại giúp mình xem

Hoàng

Bạn thêm 1 dòng (vl-load-com) vào cuối file và apload chạy lại là đượ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

Gửi bạn Tuệ,

Đúng là mình đang dùng Cad2007. Mình đã cài thử phiên bản Cad 2010 (có sẵn bộ cài trong máy) nhưng khi sử dụng db.lsp thì báo lỗi sau:

Command: ap

APPLOAD db.lsp successfully loaded.

Command: db

Select objects: Specify opposite corner: 3 found

Select objects: ; error: no function definition: VLAX-ENAME->VLA-OBJECT

Bạn thử kiểm tra lại giúp mình xem

Hoàng

 

Lisp trên viết theo đúng yêu cầu như vậy cơ mà? Lisp sẽ thống kê toàn bộ Block mà bạn chọn (Block hoặc là Block động). Cũng có thể bạn dùng CAD với phiên bản trước CAD2008. Bạn sử dụng với CAD 2008 xem nhé. Tue_NV chưa có CAD 2007, CAD2006 để thử xem nó như thế nào? Mình bảo đảm Lisp chạy tốt với CAD2008 trở lên :)

Chắc là bạn cài CAD2007 hoặc CAD2006 phải không? Tui khuyên bạn nên cài luôn CAD2008 trở lên luôn đi vì CAD2008 trở lên có những tính năng mới mà CAD2007 trở xuống không có. Vậy nhé

 

Đây là kết quả khi chạy Lisp xong

 

KET QUA:

 

EMERGENCY LIGHT (WITH SOCKET OUTLET) = 3

Lisp chạy tốt trên Cad 2007.

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ấn đề block động của bạn sao lại đổi tên nhỉ :( Mình nhớ là ngày xưa mình dùng DBlock kết hợp với Attribute mà vẫn là tên nó đó thôi ?? Lạ nhỉ..File lisp bác Tuệ viết đã test trên 08, ngon lành cành đào

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

Gửi bạn Tuệ,

Hoàng đã test và thấy lisp chạy tốt trên cad 2007, còn cad 2010 vẫn bị lỗi cũ.

Tiếc quá đang định nâng đời cad lên 2010.

Gửi ketxu

Còn vấn đề dynamic block tự động đổi tên thì mình ko biết. Bạn thử nghiên cứu xem có khắc phục được ko.

Hoà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

Gửi bạn Tuệ,

Hoàng đã test và thấy lisp chạy tốt trên cad 2007, còn cad 2010 vẫn bị lỗi cũ.

Tiếc quá đang định nâng đời cad lên 2010.

Gửi ketxu

Còn vấn đề dynamic block tự động đổi tên thì mình ko biết. Bạn thử nghiên cứu xem có khắc phục được ko.

Hoàng

Lisp chạy tốt trên Cad 2007.

hề hề...

Hôm nay mới có CAD2010, Lisp cũng chạy tốt trên Cad 2010.

 

Bạn post thông báo lỗi cho mọi nguời xem "mặt mũi" nó ra sao?

 

Bạn thêm 1 dòng (vl-load-com) vào cuối file và apload chạy lại là đượ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

Gửi bạn Gia Bạch,

Dòng vl-load-com mình đã thêm nên mới chạy được trên cad 2007.

Còn khi chạy trên cad 2010 vẫn báo lỗi cũ như dưới đây:

Command: ap

APPLOAD db.lsp successfully loaded.

Command: db

Select objects: Specify opposite corner: 3 found

Select objects: ; error: no function definition: VLAX-ENAME->VLA-OBJECT

 

http://www.cadviet.com/upfiles/3/db.lsp

Mình post cả lsp lên để bạn kiểm tra trên máy bạn xem có bị lỗi như vậy ko hay là do cad 2010 của mình.

Hoà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

Gửi bạn Tue_NV,

Bạn có thể cải tiến lisp db sao cho khi xuất ra file txt thì tên block được sắp theo thứ tự số trước và theo vần abc. Ví dụ: 0,1,…a,b,…z để tiện cho việc tìm ra block cần đếm vì nhiều khi trên bản vẽ có rất nhiều các block rác.

Tkd247

  • 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
Vào lúc 20/2/2011 tại 11:40, Tue_NV đã nói:

Cái này có thể sử dụng lệnh qselect được mà

qselect.jpg

Mình sẽ sửa lại Lisp sau của bác ssg để có thể thống kê được cả "Block động" nữa. Nhưng mình rất ngại khi bạn viết 2 từ "cao thủ" lắm. Lisp sau sẽ thống kê toàn bộ Block mà bạn chọn -> Kể cả Block hay Block động)

Đây là code

 


(defun ss2ent(ss / sodt index ent lstent)
(setq
   sodt (if ss (sslength ss) 0)
   index 0
)
(repeat sodt
   (setq
       ent (vlax-ename->vla-object (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
;copyright by SSG
;Develop by Tue_NV
(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 
     (if (vlax-property-available-p e 'EffectiveName)
(vla-get-EffectiveName e)
(vla-get-Name 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)
)
 

 

Các anh cho em nhờ chút, em dùng Qselect hay lisp db thì đều đếm chưa đúng-cho vùng block động dùng xclip ạ.

Kết quả đếm được là cả vùng block chưa xclip, mà em chỉ cần đếm vùng sau khi đã xclip.

Mong các anh giúp đỡ.

Em cảm ơn ạ.

Lat san mau.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
Vào lúc 20/2/2011 tại 11:40, Tue_NV đã nói:

Cái này có thể sử dụng lệnh qselect được mà

qselect.jpg

Mình sẽ sửa lại Lisp sau của bác ssg để có thể thống kê được cả "Block động" nữa. Nhưng mình rất ngại khi bạn viết 2 từ "cao thủ" lắm. Lisp sau sẽ thống kê toàn bộ Block mà bạn chọn -> Kể cả Block hay Block động)

Đây là code

 


(defun ss2ent(ss / sodt index ent lstent)
(setq
   sodt (if ss (sslength ss) 0)
   index 0
)
(repeat sodt
   (setq
       ent (vlax-ename->vla-object (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
;copyright by SSG
;Develop by Tue_NV
(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 
     (if (vlax-property-available-p e 'EffectiveName)
(vla-get-EffectiveName e)
(vla-get-Name 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)
)
 

 

Bác Tue_NV cho em hỏi, nếu muốn xuất kết quả đếm ra file .xls thay vì .txt được không ạ? Nếu được thì nhờ bác sửa lại lisp giúp em.

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

×