Đến nội dung


Hình ảnh
- - - - -

[Hỏi] Làm thế nào để truy xuất thông tin bên trong Block?


  • Please log in to reply
35 replies to this topic

#21 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 October 2011 - 09:51 AM


Bác cho em hỏi một câu nhé, đừng cười đấy
theo cách của bác thì em có một layer có tên VD: Tuong bao, như vậy giữa 2 chữ có một dấu cách, làm thế nào đánh được tên lớp nằm trong block
Cảm ơn bác

Nhập: "Tuong bao", chứ đừng nhập: Tuong bao!
  • 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.


#22 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 October 2011 - 09:56 AM

Mình cũng nghĩ như bạn "ketxu". Mình thấy có thể dễ dàng lấy tên của tất cả các block trên bản vẽ (kể cả các block chưa được chèn) bằng lệnh (tblnext "block" T) và (tblnext "block").
Lisp của bạn "Doan Van Ha" có nhược điểm là khi Block chèn theo 2 phương có tỉ lệ khác nhau thì sẽ không thể Explode được.

Ủa, chèn theo các tỉ lệ X, Y, Z khác nhau vẫn explode được mà. Hiện đang không thích (command "U") nên chắc sẽ chuyển qua kiểu khá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.


#23 daik50

daik50

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 22 (tàm tạm)

Đã gửi 07 October 2011 - 11:02 AM

Với lisp của bác ĐVH, bạn thay

bằng

Option T (not nil) cho phép nhập String có dấu " "




Dòng đấy lấy đối tượng VLA Activedocument (bản vẽ đang thao tác). Nếu bạn bắt đầu chơi với lisp thì những khái niệm này sẽ khó xơi đấy ^^


Em cũng đọc nhiều tài liệu trên diễn đàn rồi nhưng vẫn lơ mơ, tạm thời em đang học cách chỉnh sửa lisp đơn giản để phù hợp với mình hơn
Chưa cái nào thành công cả.
Hu hu
Thank bác nhé
  • 0

#24 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 October 2011 - 11:02 PM

À, các bạn cho mình hỏi thêm vấn đề này: Nếu trong Block đó có ... nhiều Block con nữa thì sao nhỉ???

Mọi Block đều nằm trong collection Blocks mà. Chỉ có điều lúc đó bảo chọn để ra số lượng thì hơi vất ^^

Cái này có thể chọn Blocks có chứa Layer nào đó, mà Layer này có thể nằm trong Block nhiều tầng

;Doan Van Ha CADViet.com
(defun C:HA ( / lay ename chon dsent dschon)
(setq ss nil lay (getstring T "\nNhap ten Layer nam trong Block: "))
(setq dsent (acet-ss-to-list (ssget '((0 . "INSERT")))))
(HA dsent)
(setq ss (acet-list-to-ss dschon))) ;Ten cua tap hop chon la ss [co the dung (command "erase" ss "") de test].
(defun HA(dsent)
(foreach ent dsent
(setq ename (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 (entget ent)))))))
(while ename
(cond ((and (= lay (cdr (assoc 8 (entget ename)))) (/= "INSERT" (cdr (assoc 0 (entget ename))))) (setq chon ent))
((and (= lay (cdr (assoc 8 (entget ename)))) (= "INSERT" (cdr (assoc 0 (entget ename))))) (HA (list ent))))
(setq ename (entnext ename)))
(if chon (setq dschon (cons ent dschon)))))

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


#25 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 08 October 2011 - 08:36 AM

Dùng đệ quy bác HA chú ý khử đệ quy ^^
Test với 2 block, trong mỗi block chứa 1 block khác :

Select objects: Hard error occurred ***
internal stack limit reached (simulated)"\n*** INTERNAL ERROR: VL namespace
mismatch\n"" type Y to reset: "
Hard error occurred ***


  • 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


#26 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 October 2011 - 09:15 AM

Dùng đệ quy bác HA chú ý khử đệ quy ^^
Test với 2 block, trong mỗi block chứa 1 block khác :

1). Ket gửi giùm file đó để ktra xem sao, tôi đã test trước khi post mà sao vẫn còn lỗi.
2). Tất nhiên đệ quy có nhược điểm của đệ quy, còn khử đệ quy có phải là (defun C:HA( / HA)...?
  • 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.


#27 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 08 October 2011 - 09:23 AM

Đây bác :
http://www.cadviet.c...pfiles/3/ha.dwg

Còn cái vụ duyệt qua các ename trong Block, em nhớ là phải xét SEQEND sê rả gì đó , nhưng cái này em không rành :)
  • 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


#28 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 October 2011 - 03:21 PM

Thêm một cách nữa để chọn các block có chứa layer nào đó (có thể mở rộng để chọn theo color,linetype...).


(defun C:HA( / lay dsent) ;Doan Van Ha CADViet.com
(setq lay (getstring "\nNhap ten lop nam trong block: ") ss (ssadd))
(foreach ent (acet-ss-to-list (ssget '((0 . "INSERT"))))
(foreach ent1 (acet-ss-to-list (acet-explode ent))
(if (equal lay (cdr (assoc 8 (entget ent1))))
(setq dsent (if (not (member ent dsent)) (cons ent dsent) dsent))))
(command "u"))
(setq ss (if dsent (acet-list-to-ss dsent) nil)) ; ss la tap hop chon cua cac block co chua layer lay (2 dong duoi chi de test).
(princ (strcat "\nSo block co chua doi tuong thuoc layer " lay " la: " (if ss (itoa (sslength ss)) "0")))
(princ))

Hề hề hề,
Bác sử dụng explode rồi sau đó lại undo xem ra hơi vất vả.
Theo thiển ý của mình (đúng hơn là theo cái mình mót đượic của .....thiên hạ) thì có thể duyệt qua các đối tựơng trong block bằng cách sử dụng hàm entnext với vòng lặp while bác ạ. Tỷ như:
(setq ent (cdr (assoc -2 (tblsearch "block" blname))))
(while (/= ent nil)
(do smthing)
(setq ent (entnext ent))
)
và như vậy để duyệt qua tất cả các block có trên bản vẽ bác chỉ cần tạo một list các tên block có trên bản vẽ theo kiểu bác ketxu hay của bác (có dùng sort) rồi foreach là ngon lành.
Vì mình không có nhiều thời gian nên chưa viết cụ thể được, mong bác thông cảm, chỉ là vài suy nghĩ định hướng nếu có trật thì mong bác chớ chê cười, còn nếu đúng bác thử triển khai nhé.
Chúc bác vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#29 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 October 2011 - 03:26 PM

Nhập: "Tuong bao", chứ đừng nhập: Tuong bao!

Hề hề hề,
hổng phải đâu là hổng phải đâu.
bác ketxu đã trả lời bạn ấy rùi bác ạ
Hề hề hề...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#30 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 October 2011 - 04:47 PM

Hề hề hề,
hổng phải đâu là hổng phải đâu.
bác ketxu đã trả lời bạn ấy rùi bác ạ
Hề hề hề...

Ketxu trả lời đúng theo nguyên lý của hàm getstring, nhưng cách nhập "a b" cũng không sai, có dỡ chăng là phải thêm 2 dấu " mà thôi. Bác kiểm tra lại xem sao hè.
  • 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.


#31 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 October 2011 - 04:50 PM

Hề hề hề,
Bác sử dụng explode rồi sau đó lại undo xem ra hơi vất vả.
Theo thiển ý của mình (đúng hơn là theo cái mình mót đượic của .....thiên hạ) thì có thể duyệt qua các đối tựơng trong block bằng cách sử dụng hàm entnext với vòng lặp while bác ạ. Tỷ như:
(setq ent (cdr (assoc -2 (tblsearch "block" blname))))
(while (/= ent nil)
(do smthing)
(setq ent (entnext ent))
)
và như vậy để duyệt qua tất cả các block có trên bản vẽ bác chỉ cần tạo một list các tên block có trên bản vẽ theo kiểu bác ketxu hay của bác (có dùng sort) rồi foreach là ngon lành.
Vì mình không có nhiều thời gian nên chưa viết cụ thể được, mong bác thông cảm, chỉ là vài suy nghĩ định hướng nếu có trật thì mong bác chớ chê cười, còn nếu đúng bác thử triển khai nhé.
Chúc bác vui.

Bác PTB ạ, thấy chán thằng (command "u") nên tôi đã edit lại ở sau bài đó, bác xem lại giùm đi (đúng ý tưởng entnext của bác). Tuy nhiên nếu block lồng block thì đang có lỗi nên tôi đang cố gắng sửa mà chưa được, chứ block không lồng block thì vô tư rồi.
  • 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.


#32 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 October 2011 - 11:58 PM

Cuối cùng cũng giải quyết được lỗi, để chọn được các block lồng nhau mà trong block có chứa 1 layer nào đó. Hy vọng ok.

;----- Doan Van Ha CADViet.com
(defun C:HA (/ dsent ename)
(vl-load-com)
(setq ss (ssadd) lay (getstring T "\nNhap ten Layer nam trong Block: "))
(setq dsent (acet-ss-to-list (ssget '((0 . "INSERT")))))
(foreach ent dsent
(HA (cdr (assoc 2 (entget ent))))))
(defun HA (ename / ename1)
(setq ename1 (tblobjname "block" ename))
(while (setq ename1 (entnext ename1))
(cond
((= (cdr (assoc 0 (entget ename1))) "INSERT")
(HA (cdr (assoc 2 (entget ename1)))))
((and (/= "INSERT" (cdr (assoc 0 (entget ename1)))) (/= "SEQEND" (cdr (assoc 0 (entget ename1)))) (= lay (cdr (assoc 8 (entget ename1)))))
(setq ss (ssadd ent ss)))))) ;Ten cua tap hop chon la ss [co the dung (command "erase" ss "") de test].

  • 2

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


#33 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 October 2011 - 07:09 AM

Tốt rồi bác ạ. Thêm check Sequend thì mới có đường thoát chứ ^^ Hay là bác nhích lên 1 tí, ssadd cả thằng Block bên trong không chứa đối tượng nào thuộc layer đã định, nhưng nó lại nằm trên layer đó đi ^^
(and (= Insert)(= lay)) => OK
Ngoài ra e nghĩ điều kiện vòng lặp while nên thêm 1 flag T/nil. Nếu tìm thấy 1 đối tượng bất kỳ trong Block thuộc layer chỉ định thì đổi flag và thoát khỏi vòng lặp luôn, giúp giảm số lần kiểm tra ^^
  • 1

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


#34 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 09 October 2011 - 10:42 AM

Tốt rồi bác ạ. Thêm check Sequend thì mới có đường thoát chứ ^^ Hay là bác nhích lên 1 tí, ssadd cả thằng Block bên trong không chứa đối tượng nào thuộc layer đã định, nhưng nó lại nằm trên layer đó đi ^^
(and (= Insert)(= lay)) => OK
Ngoài ra e nghĩ điều kiện vòng lặp while nên thêm 1 flag T/nil. Nếu tìm thấy 1 đối tượng bất kỳ trong Block thuộc layer chỉ định thì đổi flag và thoát khỏi vòng lặp luôn, giúp giảm số lần kiểm tra ^^

Lisp dưới đây đã hiệu chỉnh để có thể:
- Chọn các Blocks mà trong Block có chứa 1 Layer nào đó đã chỉ định.
- Các Blocks có thể lồng nhau nhiều tầng.
- Có thêm tuỳ chọn để có thể chọn cả Block con nằm trên Layer đó.
@Ketxu: Hỏi nhỏ tí, viết cho CV "giàu" thế mà không đủ sống sao còn kiếm cơm bằng nghề... phụ?

;----- Doan Van Ha CADViet.com
(defun C:HA (/ dsent ename layblk)
(setq ss (ssadd) lay (getstring T "\nNhap ten Layer nam trong Block: "))
(setq dsent (acet-ss-to-list (ssget '((0 . "INSERT")))))
(foreach ent dsent
(HA (cdr (assoc 2 (entget ent))))))
(defun HA (ename / ename1 flag)
(setq ename1 (tblobjname "block" ename))
(while (and (not flag) (setq ename1 (entnext ename1)))
(cond
((and (= "INSERT" (cdr (assoc 0 (entget ename1)))) (/= lay (cdr (assoc 8 (entget ename1)))))
(HA (cdr (assoc 2 (entget ename1)))))
((and (= "INSERT" (cdr (assoc 0 (entget ename1)))) (= lay (cdr (assoc 8 (entget ename1)))))
(cond
((not layblk)
(initget "Y N")
(setq layblk (getkword (strcat "\nBan co muon chon luon ca block con chua layer " lay " hay khong? [N/<Y>]: ")))
(if (not layblk) (setq layblk "Y"))))
(if (= layblk "N")
(HA (cdr (assoc 2 (entget ename1))))
(setq ss (ssadd ent ss) flag T)))
((and (/= "INSERT" (cdr (assoc 0 (entget ename1)))) (/= "SEQEND" (cdr (assoc 0 (entget ename1)))) (= lay (cdr (assoc 8 (entget ename1)))))
(setq ss (ssadd ent ss) flag T))))) ;Ten cua tap hop chon la ss, co the dung (command "erase" ss "") de test.

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


#35 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 October 2011 - 11:45 AM

Trả lời nhỏ bác : Viết cho CV 100% Free mà bác^^. Học hỏi là chính, còn viết lấy phí thì e cũng nghĩ tới, và chắc là cũng phải áp dụng, mặc dù biết thừa là cái thu về chẳng bằng cái râu của cái đã bỏ ra, nhưng phải có hình thức để sàng lọc những người thực sự cần với những người yêu cầu chơi chơi chứ ^^
SV mới ra trường kiếm miếng cơm cũng khó, mọi người đánh vó hết rồi. Giờ e còn phải trau dồi thêm KT, điện, nước...để kiếm tí thô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


#36 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 09 October 2011 - 08:54 PM

Các lisp của bạn ketxu và bạn Ha đã tốt dần đến mức hoàn thiện, không cần góp ý gì thêm nữa. Qua các trao đổi trên đây, mình đã có rất nhiều kinh nghiệm trong lập trình. Chân thành cám ơn các bạn!!
  • 0