Đến nội dung


Hình ảnh
- - - - -

Nhờ sửa lisp đếm block


  • Please log in to reply
35 replies to this topic

#1 790312

790312

    biết lệnh fillet

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

Đã gửi 19 July 2011 - 06:24 PM

Mình tải được lisp đếm block trên diễn đàn nhưng lisp này đếm số lượng rồi tự đông ghi ra text trên cad.Nay mình muốn không muốn ghi ra text mà sẽ hiệ số lượng trên màn hình ngay con trỏ chuột luôn.Thanks.
(defun c:cb ()
(vl-load-com)
(setq p1 (getpoint "\nKhoanh vung chon doi tuong: ")
p2 (getcorner p1)
p3 (getpoint "\nVi tri dat text")
ht (getvar "textsize")
oldos (getvar "osmode"))
(setq name T)
(setvar "osmode" 0)
(while name
(setq name (car (entsel "\nChon loai block can dem: ")))
(while (= name nil)
(setq name (car (entsel "\nChon loai block can dem: ")))
)
(setq ent (entget name))
(command "zoom" p1 p2)
(setq nhomb (ssget "c" p1 p2 (list (assoc 0 ent) (assoc 2 ent)))
noidung (strcat "so den: " (cdr (assoc 2 ent)) " co " (rtos (sslength nhomb) 2 0) " cai")
)
(command "text" p3 "" "" noidung)
(setq p3 (polar p3 (/ (* pi 3) 2) (/ (* ht 5) 3)))
(command "zoom" "p")
(setq dk (getstring "\nBan co muon tiep tuc khong: Co/Khong: <CO>: "))
(if (= (strcase dk) "K") (setq name nil))
(if (or (= (strcase dk) "C") (= dk "")) (setq name T))
)
(setvar "osmode" 15359)
)

  • 0

#2 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 19 July 2011 - 07:23 PM

Mình tải được lisp đếm block trên diễn đàn nhưng lisp này đếm số lượng rồi tự đông ghi ra text trên cad.Nay mình muốn không muốn ghi ra text mà sẽ hiệ số lượng trên màn hình ngay con trỏ chuột luôn.Thanks.

Sửa thế này được không Bạn?

(defun c:cb ()
(vl-load-com)
(setq p1 (getpoint "\nKhoanh vung chon doi tuong: ")
p2 (getcorner p1)
ht (getvar "textsize")
oldos (getvar "osmode"))
(setq name T)
(setvar "osmode" 0)
(while name
(setq name (car (entsel "\nChon loai block can dem: ")))
(while (= name nil)
(setq name (car (entsel "\nChon loai block can dem: "))))
(setq ent (entget name))
(command "zoom" p1 p2)
(setq nhomb (ssget "c" p1 p2 (list (assoc 0 ent) (assoc 2 ent)))
noidung (strcat "so den: " (cdr (assoc 2 ent)) " co " (rtos (sslength nhomb) 2 0) " cai"))
(alert noidung)
(command "zoom" "p")
(setq dk (getstring "\nBan co muon tiep tuc khong: Co/Khong: <CO>: "))
(if (= (strcase dk) "K") (setq name nil))
(if (or (= (strcase dk) "C") (= dk "")) (setq name T)))
(setvar "osmode" 15359))
P/S 790312: "ý mình là nó hiện lên giống dòng KHOANH VÙNG CHỌN ĐỐI TƯỢNG và CHỌN LOẠI BLOCK CẦN ĐẾM ...bạn ah.Dù gì cũng vote bạn 1 cái."
Cái này tôi chưa biết nên chịu!!! Ai biết chỉ giùm 790312.
  • 1

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


#3 790312

790312

    biết lệnh fillet

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

Đã gửi 19 July 2011 - 07:41 PM

ý mình là nó hiện lên giống dòng KHOANH VÙNG CHỌN ĐỐI TƯỢNG và CHỌN LOẠI BLOCK CẦN ĐẾM ...bạn ah.Dù gì cũng vote bạn 1 cái.
  • 0

#4 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 19 July 2011 - 07:58 PM

Sửa thế này được không Bạn?


(defun c:cb ()
(vl-load-com)
(setq p1 (getpoint "\nKhoanh vung chon doi tuong: ")
p2 (getcorner p1)
ht (getvar "textsize")
oldos (getvar "osmode"))
(setq name T)
(setvar "osmode" 0)
(while name
(setq name (car (entsel "\nChon loai block can dem: ")))
(while (= name nil)
(setq name (car (entsel "\nChon loai block can dem: "))))
(setq ent (entget name))
(command "zoom" p1 p2)
(setq nhomb (ssget "c" p1 p2 (list (assoc 0 ent) (assoc 2 ent)))
noidung (strcat "so den: " (cdr (assoc 2 ent)) " co " (rtos (sslength nhomb) 2 0) " cai"))
(alert noidung)
(command "zoom" "p")
(setq dk (getstring "\nBan co muon tiep tuc khong: Co/Khong: <CO>: "))
(if (= (strcase dk) "K") (setq name nil))
(if (or (= (strcase dk) "C") (= dk "")) (setq name T)))
(setvar "osmode" 15359))
P/S 790312: "ý mình là nó hiện lên giống dòng KHOANH VÙNG CHỌN ĐỐI TƯỢNG và CHỌN LOẠI BLOCK CẦN ĐẾM ...bạn ah.Dù gì cũng vote bạn 1 cái."
Cái này tôi chưa biết nên chịu!!! Ai biết chỉ giùm 790312.

Nếu ý bạn đó muốn hiện trên command line thì dùng
(prompt noidung)
(getstring)
thay cho
(alert noidung)
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#5 790312

790312

    biết lệnh fillet

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

Đã gửi 19 July 2011 - 08:11 PM

Nếu ý bạn đó muốn hiện trên command line thì dùng
(prompt noidung)
(setq tmp(getstring))
thay cho
(alert noidung)

Được rồi bạn ah nhưng phía sau có cái ô màu xanh đánh chữ vào được vậy bỏ ô này bằng cách nào?
  • 0

#6 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 19 July 2011 - 08:13 PM

Nếu ý bạn đó muốn hiện trên command line thì dùng
(prompt noidung)
(getstring)
thay cho
(alert noidung)

Không phải đâu! Hiện trên màn hình và di chuyển theo sự di chuyển của con chuột cơ!
  • 0

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


#7 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 19 July 2011 - 08:27 PM

Không phải đâu! Hiện trên màn hình và di chuyển theo sự di chuyển của con chuột cơ!

Mình edit lại code của bạn, bạn test thử có gì chỉnh lại dùm nhe

(defun c:cb ()
(vl-load-com)
(setq p1 (getpoint "\nKhoanh vung chon doi tuong: ")
p2 (getcorner p1)
ht (getvar "textsize")
oldos (getvar "osmode")
)
(setq name T)
(setvar "osmode" 0)
(while name
(setq name (car (entsel "\nChon loai block can dem: ")))
(while (= name nil)
(setq name (car (entsel "\nChon loai block can dem: ")))
)
(setq ent (entget name))
(command "zoom" p1 p2)
(setq nhomb (ssget "c" p1 p2 (list (assoc 0 ent) (assoc 2 ent)))
noidung (strcat "so den: "
(cdr (assoc 2 ent))
" co "
(rtos (sslength nhomb) 2 0)
" cai"
)
)
(prompt noidung)
(getstring)
(command "zoom" "p")
(setq
dk (getstring "\nBan co muon tiep tuc khong: Co/Khong: <CO>: ")
)
(if (= (strcase dk) "K")
(setq name nil)
)
(if (or (= (strcase dk) "C") (= dk ""))
(setq name T)
)
)
(setvar "osmode" 15359)
)

p/s: bạn phải mở Dynamic Input nó mới hiện lên ngay con trỏ chuột
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#8 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 19 July 2011 - 08:43 PM

Mình edit lại code của bạn, bạn test thử có gì chỉnh lại dùm nhe
p/s: bạn phải mở Dynamic Input nó mới hiện lên ngay con trỏ chuột

Cái này được rồi, nhưng bỏ dòng (prompt noidung) đi và thay (getstring) bởi (getstring noidung) thì ngắn hơn được 1 chút.
P/S 790312: cái này đáp ứng y/c của bạn, nhưng cũng mất 1 động tác Enter đấy!
  • 0

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


#9 790312

790312

    biết lệnh fillet

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

Đã gửi 19 July 2011 - 08:49 PM

2 bạn xem bài số 5 rồi giúp mình với.
  • 0

#10 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 19 July 2011 - 09:22 PM

Cái này được rồi, nhưng bỏ dòng (prompt noidung) đi và thay (getstring) bởi (getstring noidung) thì ngắn hơn được 1 chút.
P/S 790312: cái này đáp ứng y/c của bạn, nhưng cũng mất 1 động tác Enter đấy!

Hì hì, alert thì mình cũng phải enter mà, chỉ trừ prompt và princ nhưng sau đó lại có command zoom nên nó sẽ chạy mất câu thông báo :rolleyes:

2 bạn xem bài số 5 rồi giúp mình với.

Vậy bạn muốn làm sao để AutoCAD hiểu được là bạn muốn tiếp tục công việc nếu ko bấm enter? <_< nếu bạn chỉ muốn dừng 1 khoảng thời gian cố định thì dùng 1 cái while (với số lần lặp cho trước.)
Thân!
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#11 t031285

t031285

    biết vẽ rectang

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

Đã gửi 20 July 2011 - 06:50 AM

Mình cũng sưu tầm được lisp đếm block,mong các bác sửa cho nó hiện số block đếm được lên màn hình giống lisp ở trên.Thanks.
(Defun c:bb ( ) 
(prompt "\nChon BLOCK mau.")
(setq DT (car (entsel)))
(setq DT (entget DT))
(setq STNAME (cdr (assoc 2 DT)))
(Princ "\nHay chon vung :")
(setq SS (ssget (list (cons 0 "insert")
(cons 2 STNAME)
)
)
)
(if (Null ss)
(princ "\nKhong tim thay doi tuong nao")
)
(IF (/= NIL SS) (PROGN
(setq Sl (SSLength SS))
(princ (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
)
)
(princ)
)

  • 0

#12 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 July 2011 - 07:12 AM

Mình cũng sưu tầm được lisp đếm block,mong các bác sửa cho nó hiện số block đếm được lên màn hình giống lisp ở trên.Thanks.

(Defun c:bb ( ) 
(prompt "\nChon BLOCK mau.")
(setq DT (car (entsel)))
(setq DT (entget DT))
(setq STNAME (cdr (assoc 2 DT)))
(Princ "\nHay chon vung :")
(setq SS (ssget (list (cons 0 "insert")
(cons 2 STNAME)
)
)
)
(if (Null ss)
(princ "\nKhong tim thay doi tuong nao")
)
(IF (/= NIL SS) (PROGN
(setq Sl (SSLength SS))
(princ (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
)
)
(princ)
)

Sửa lại cho bạn :

(Defun c:bb (/ dynm dynp DT STNAME SS SL)
(setq dynm (getvar "dynmode"))
(setq dynp (getvar "dynprompt"))
(mapcar 'setvar '("dynmode" "dynprompt") '(1 1))
(prompt "\nChon BLOCK mau.")
(setq DT (car (entsel)))
(setq DT (entget DT))
(setq STNAME (cdr (assoc 2 DT)))
(Princ "\nHay chon vung :")
(setq SS (ssget (list (cons 0 "insert")
(cons 2 STNAME)
)
)
)
(if (Null ss)
(princ "\nKhong tim thay doi tuong nao")
)
(IF (/= NIL SS) (PROGN
(setq Sl (SSLength SS))
(getstring (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
)
)
(princ)
(mapcar 'setvar '("dynmode" "dynprompt") ( list dynm dynp))
)

.........
p/s: bạn phải mở Dynamic Input nó mới hiện lên ngay con trỏ chuột

Bạn Nên set và trả lại biến hệ thống DYNMODE và DYNPROMPT trong Lisp
  • 1

#13 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 20 July 2011 - 08:12 AM

Bạn Nên set và trả lại biến hệ thống DYNMODE và DYNPROMPT trong Lisp


Thanks Tue_NV, cái đó là p/s cho bạn Doan Van Ha vì mình nghĩ có lẽ bạn đó chưa mở lên còn chủ topic có mở rồi (đọc yêu cầu là thấy ngay)
Do mình ko thích set lại các biến hệ thống về giao diện (ảnh hưởng đến thói quen của người dùng) có ng khi đánh lệnh thường nhìn vào command line nhưng nếu set các biến như TueNV đã làm thì nếu user cacel command khi chọn Block biến đó sẽ ko dc trả lại như cũ.
Vậy nếu muốn mình nên set trước khi show thông báo và sau đó trả lại như cũ thì có lẽ tốt hơn.


.....
(mapcar 'setvar '("dynmode" "dynprompt") '(1 1))
(getstring (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
(mapcar 'setvar '("dynmode" "dynprompt") ( list dynm dynp))
.....


  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#14 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 20 July 2011 - 08:34 AM

Thanks Tue_NV, cái đó là p/s cho bạn Doan Van Ha vì mình nghĩ có lẽ bạn đó chưa mở lên còn chủ topic có mở rồi (đọc yêu cầu là thấy ngay)
Do mình ko thích set lại các biến hệ thống về giao diện (ảnh hưởng đến thói quen của người dùng) có ng khi đánh lệnh thường nhìn vào command line nhưng nếu set các biến như TueNV đã làm thì nếu user cacel command khi chọn Block biến đó sẽ ko dc trả lại như cũ.
Vậy nếu muốn mình nên set trước khi show thông báo và sau đó trả lại như cũ thì có lẽ tốt hơn.


.....
(mapcar 'setvar '("dynmode" "dynprompt") '(1 1))
(getstring (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
(mapcar 'setvar '("dynmode" "dynprompt") ( list dynm dynp))
.....

Nếu nói tới cùng thì ngay cả cách của Detailing cũng chưa triệt để, mà nó chỉ "ít nguy cơ hơn" Tue_NV vì nó "nằm sát" dòng "getstring..." mà thôi. Bởi nếu khi nó xuất hiện dòng thông báo mà ta bấm "esc" thì nó cũng không trở về biến cũ. Cần phải dùng thêm thằng "error" nữa mới OK tuyệt đối được.
Nhưng thiết nghĩ, ở đây chỉ giải quyết 1 y/c là hiện thông báo theo con chuột thì như thế là được rồi các bạn ạ.
Nói thêm cho vui: để 1 lsp hoàn chỉnh tuyệt đối là hơi bị mệt. Đôi khi chúng ta vẫn thường viết nhanh để đạt 1 mục tiêu nào đó mà không quá chi li về các vấn đề liên quan khác. Chẳng hạn, chỉ mỗi y/c nhập số lần copy, chúng ta vẫn thường viết (setq sl (getint "Nhap so lan copy: ")), mà chúng ta ít để ý khi người dùng nhập "-3" thì sẽ thế nào. Do đó, bỏ quên (initget) trong trường hợp này là thường, trên CADViet có muôn vàn.
Chúc mọi người 1 ngày làm việc vui vẻ!
  • 0

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


#15 t031285

t031285

    biết vẽ rectang

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

Đã gửi 20 July 2011 - 08:43 AM

Sửa lại cho bạn :


(Defun c:bb (/ dynm dynp DT STNAME SS SL)
(setq dynm (getvar "dynmode"))
(setq dynp (getvar "dynprompt"))
(mapcar 'setvar '("dynmode" "dynprompt") '(1 1))
(prompt "\nChon BLOCK mau.")
(setq DT (car (entsel)))
(setq DT (entget DT))
(setq STNAME (cdr (assoc 2 DT)))
(Princ "\nHay chon vung :")
(setq SS (ssget (list (cons 0 "insert")
(cons 2 STNAME)
)
)
)
(if (Null ss)
(princ "\nKhong tim thay doi tuong nao")
)
(IF (/= NIL SS) (PROGN
(setq Sl (SSLength SS))
(getstring (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
)
)
(princ)
(mapcar 'setvar '("dynmode" "dynprompt") ( list dynm dynp))
)


Bạn Nên set và trả lại biến hệ thống DYNMODE và DYNPROMPT trong Lisp

Nhờ bác chỉnh sao cho CHỌN BLOCK MẪU và HÃY CHỌN VÙNG hiện lên màn hình luôn giùm e với.Thanks.
  • 0

#16 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 July 2011 - 08:45 AM

<_< nếu bạn chỉ muốn dừng 1 khoảng thời gian cố định thì dùng 1 cái while (với số lần lặp cho trước.)
Thân!

Dùng Delay cũng được vậy ^^
  • 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


#17 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 July 2011 - 09:04 AM

Nhờ bác chỉnh sao cho CHỌN BLOCK MẪU và HÃY CHỌN VÙNG hiện lên màn hình luôn giùm e với.Thanks.

Bạn thay dòng này :
(setq DT (car (entsel)))
thành dòng :
(setq DT (car (entsel "\nChon BLOCK mau.")))

Còn "HÃY CHỌN VÙNG" thì đó chính là select object rồi. Thay dòng select object đó thì bó tay vì đó là dòng nhắc của hàm ssget
  • 0

#18 t031285

t031285

    biết vẽ rectang

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

Đã gửi 20 July 2011 - 09:23 AM

lisp bài 1 làm hiện được đó bác.Dù sao cũng cám ơn bác nhiều.
  • 0

#19 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 July 2011 - 09:49 AM

Nhờ bác chỉnh sao cho CHỌN BLOCK MẪU và HÃY CHỌN VÙNG hiện lên màn hình luôn giùm e với.Thanks.

Cá nhân mình thấy việc này khá vô bổ t031285 ạ :rolleyes:
  • 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


#20 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 20 July 2011 - 10:09 AM

Xin hỏi Tue_NV: Có cách nào mình làm được như sau không?
- Chọn block mẫu
- Chọn vùng chứa block: vùng này là 1 polyline khép kín chứa block cần đếm.Chỉ cần pick chọn PL là đếm được số block trong vùng kín.
Cám ơn !
  • 0