Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
15 replies to this topic

#1 hoangtdh

hoangtdh

    biết vẽ ellipse

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

Đã gửi 20 February 2011 - 09:18 AM

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

#2 hoangtdh

hoangtdh

    biết vẽ ellipse

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

Đã gửi 20 February 2011 - 10:44 AM

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.c...lock_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
  • 0

#3 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 20 February 2011 - 11:15 AM

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 :)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 20 February 2011 - 11:40 AM

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.c...lock_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à
Hình đã gửi
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)
)

  • 6

#5 hoangtdh

hoangtdh

    biết vẽ ellipse

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

Đã gửi 20 February 2011 - 02:28 PM

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

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 20 February 2011 - 05:24 PM

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

#7 hoangtdh

hoangtdh

    biết vẽ ellipse

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

Đã gửi 20 February 2011 - 07:47 PM

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

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 20 February 2011 - 08:06 PM

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

#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 20 February 2011 - 10:36 PM

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.
  • 0

#10 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 21 February 2011 - 12:39 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#11 hoangtdh

hoangtdh

    biết vẽ ellipse

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

Đã gửi 21 February 2011 - 07:57 AM

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

#12 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 21 February 2011 - 11:12 AM

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


  • 0

#13 hoangtdh

hoangtdh

    biết vẽ ellipse

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

Đã gửi 21 February 2011 - 12:41 PM

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.c...pfiles/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
  • 0

#14 tkd247

tkd247

    biết zoom

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

Đã gửi 06 August 2012 - 05:59 PM

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

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 06 August 2012 - 08:59 PM

Bạn thêm dòng này:
(setq Ln (acad_strlsort Ln))
Vào ngay sát trên dòng này:
(foreach Bn Ln
  • 4

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#16 tkd247

tkd247

    biết zoom

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

Đã gửi 07 August 2012 - 10:15 AM

Gửi bạn Doan Van Ha,
Chuẩn không cần chỉnh, cám ơn bạn nhiều.
Tkd247
  • 0