Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
tkd247

[Yêu cầu] Lisp lọc các block cùng tên

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

tkd247    2

Gửi các bạn trong diễn đàn Cad Việt,

Mình hay phải sử dụng lệnh filter để lọc các block cùng tên nhưng lệnh này sử dụng hộp thoại phải thao tác nhiều rất mất thời gian. Vì vậy nhờ các bạn viết hộ lisp có nội dung như sau: Chọn 1 block từ bản vẽ, chọn vùng lọc, sau đó lọc các block có cùng tên với block chọn.

Mình gửi kèm hình minh họa để các bạn tham khảo.

http://www.cadviet.com/upfiles/3/101944_minh_hoa_lisp_loc_block_cung_ten.dwg

Rất mong được giúp đỡ,

Tkd247

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
Doan Van Ha    2.676

Gửi các bạn trong diễn đàn Cad Việt,

Mình hay phải sử dụng lệnh filter để lọc các block cùng tên nhưng lệnh này sử dụng hộp thoại phải thao tác nhiều rất mất thời gian. Vì vậy nhờ các bạn viết hộ lisp có nội dung như sau: Chọn 1 block từ bản vẽ, chọn vùng lọc, sau đó lọc các block có cùng tên với block chọn.

Mình gửi kèm hình minh họa để các bạn tham khảo.

http://www.cadviet.c...ck_cung_ten.dwg

Rất mong được giúp đỡ,

Tkd247

 

Đây bạn! Hình như bạn đã là lần thứ 3 post y/c thì phải, và 2 lần đầu bị xoá vì sai quy định. Lần này thì tương đối đúng.

(defun C:HA ( / ten)
(setq ten (assoc 2 (entget (car (entsel "\nChon Block mau: ")))))
(princ "\nChon cac Block...")
(setq ss (ssget (list (cons 0 "INSERT") ten))))

  • 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
ketxu    2.649

Vấn đề "cùng tên" thì OP phải chỉ rõ Như thế nào là cùng tên ? Nhất là trong trường hợp Dynamic Block đã thay đổi action

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
tkd247    2

Gửi bạn Doan Van Ha,

Cám ơn bạn đã giúp đỡ. Mình đã test và về cơ bản là ok. Bạn có thể chỉnh sửa thêm để cho các đối tượng được chọn được bôi đen trên màn hình (giống như lệnh filter) để có thể copy sang bản vẽ khác được ko?

Gửi bạn ketxu,

Đối với Dynamic Block thì khi dùng lệnh copy thì đối tượng mới mang 1 tên khác nên không dùng lệnh filter được mà phải dùng qseclect mới chọn được các block cùng tên gốc. Chính vì vậy nên mình rất ít dùng Dynamic Block mặc dù nó khá tiện lợi. Nếu bạn có thể mở rộng code để sử dụng với Dynamic Block thì tốt quá (tên block được định nghĩa bởi Edit block definition).

P/S: Trước khi gửi bài mình đã đọc nội qui hướng dẫn post bài như đường link dưới đây tại Cad Việt:

http://www.cadviet.c...php?showtopic=4

thì không thấy update các nội dung chi tiết như bài ở đường link dưới đây:

http://www.cadviet.c...showtopic=44534

Vì vậy đề nghị ban quản trị diễn đàn update lại thong tin để cho những thành viên mới biết khi post bài

Tkd247

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
ketxu    2.649

Tất cả yêu cầu của bạn ở trên đều .. "Dư sức qua cầu" với bác Hạ , hãy chịu khó chờ nhé :)

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
Doan Van Ha    2.676

Tất cả yêu cầu của bạn ở trên đều .. "Dư sức qua cầu" với bác Hạ , hãy chịu khó chờ nhé :)

 

Leo cầu bê tông quen rồi, cái này là cầu khỉ, chưa gặp và chưa leo nên sợ bị té, Ket leo quen thì chơi luôn giùm bạn ấy đi mà. Nhờ 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
ketxu    2.649

 

Leo cầu bê tông quen rồi, cái này là cầu khỉ, chưa gặp và chưa leo nên sợ bị té, Ket leo quen thì chơi luôn giùm bạn ấy đi mà. Nhờ thật đấy!

^^

Theo như ý của bạn OP thì nó là effectivename, không phải xử lý trường hợp DB đã thực thi action

 

P/s : code :

(defun c:test(/ rn ssblk blkName)(vl-load-com)
(prompt "\nChon Block mau :")
(setq   rn (lambda(x)(vla-get-EffectiveName (vlax-ename->vla-object x)))
 blkName (rn (ssname (ssget ":S" (list (cons 0 "INSERT"))) 0)))
(prompt "\nChon khu vuc chua Block :")
(setq ssBlk (ssget (list (cons 0 "INSERT")(cons 2 (strcat "`*U*," blkName)))))
(mapcar '(lambda(x)(if (not (eq (rn x) blkName))(ssdel x ssblk)))
(mapcar 'cadr (vl-remove-if '(lambda(x)(listp (cadr x))) (ssnamex ssBlk)))) ;hoac thay bang acet neu thich nhe ^^
(sssetfirst nil ssBlk)
)

  • Vote tăng 4

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
Doan Van Ha    2.676

Gửi bạn Doan Van Ha,

Cám ơn bạn đã giúp đỡ. Mình đã test và về cơ bản là ok. Bạn có thể chỉnh sửa thêm để cho các đối tượng được chọn được bôi đen trên màn hình (giống như lệnh filter) để có thể copy sang bản vẽ khác được ko?

 

Có phải bạn muốn như thế này không?

(defun C:HA ( / ten)
(setq ten (assoc 2 (entget (car (entsel "\nChon Block mau: ")))))
(princ "\nChon cac Block...")
(setq ss (ssget (list (cons 0 "INSERT") ten)))
(sssetfirst nil ss))	;hien Grips.

@Ketxu: thank Ketxu, nhưng tôi chưa hề dùng Dyn_Block nên hơi bị... lạc hậu chuyện này.

  • 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

Em cảm ơn các anh đã hỗ trợ code.

Em có nhu cầu tương tự là chọn các block cùng tên, mở rộng thêm:

Đánh lệnh

Chọn block mẫu 1

Chọn block mẫu 2

.....

Chọn block mẫu 5

Chọn vùng chứa block

Ra kết quả chọn được bao nhiêu block và cho phép hiện grips.

 

Em cảm ơn các anh ạ

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
Doan Van Ha    2.676

Đây bạn!

 

; Chon tap block theo ten cua tap block mau.
(defun C:HA ( / i str ent)
 (setq i 2 str (cdr (assoc 2 (entget (car (entsel (strcat "\nChon Block mau 1: ")))))))
 (while (setq ent (car (entsel (strcat "\nChon Block mau " (itoa i) ": "))))
  (setq str (strcat str "," (cdr (assoc 2 (entget ent)))))
  (setq i (1+ i)))
 (princ "\nChon cac Block can thong ke...")
 (sssetfirst nil (ssget (list (cons 0 "INSERT") (cons 2 str)))))
  • 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ảm ơn anh Doan Van Ha, lisp này đã đáp ứng trọn vẹn nhu cầu của em. Anh thật đáng ngưỡng mộ.

Em thường sử dụng FI để chọn nhiều block, nay có thêm lisp này thì giúp tăng thêm hiệu quả công việc, giảm thời gian select đối tượ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

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


×