Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
vietduc147258

Nhờ sửa lisp để lọc được Block động cùng tên

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

Mình có sưu tập được lisp lọc để chọn đối tượng block cùng tên rất tiện dụng. Nhưng không lọc được các block động (Dynamic Block). Đã thử  QSELECT và FILTER nhưng cũng thất bại.

Mong các bác giúp em sửa lisp lọc này.

(defun c:fb ( / blockname sset); filter all blocks of same name
 (setq blockname (cdr (assoc 2 (entget (car (entsel))))))
 (setq sset (ssget (list (cons 2 blockname))))
 (sssetfirst sset sset)
 (princ (strcat "\nSelected " (itoa (sslength sset)) " instances of block \"" blockname "\"."))
 (princ)
)

P/S: Có lisp SelDB.vlx làm được việc này nhưng khi load lisp nó mở lên trang web cộng với chức năng tìm kiếm chuyên sâu hơn. Nên lisp dùng hơi nhiều thao tác. https://www.cadstudio.cz/dl/SelDB.vlx

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
2 giờ trước, vietduc147258 đã nói:

Mình có sưu tập được lisp lọc để chọn đối tượng block cùng tên rất tiện dụng. Nhưng không lọc được các block động (Dynamic Block). Đã thử  QSELECT và FILTER nhưng cũng thất bại.

Mong các bác giúp em sửa lisp lọc này.


(defun c:fb ( / blockname sset); filter all blocks of same name
 (setq blockname (cdr (assoc 2 (entget (car (entsel))))))
 (setq sset (ssget (list (cons 2 blockname))))
 (sssetfirst sset sset)
 (princ (strcat "\nSelected " (itoa (sslength sset)) " instances of block \"" blockname "\"."))
 (princ)
)

P/S: Có lisp SelDB.vlx làm được việc này nhưng khi load lisp nó mở lên trang web cộng với chức năng tìm kiếm chuyên sâu hơn. Nên lisp dùng hơi nhiều thao tác. https://www.cadstudio.cz/dl/SelDB.vlx

Bạn xem được không nhé

(defun C:CBLM (/ ent1 ss ssblc tenblmau)
(setq ent1 (car (LM:SelectIf "\nCh\U+1ECDn Block m\U+1EABu:" (lambda (x) (eq "INSERT" (cdr (assoc 0 (entget (car x))))) ) entsel nil)))
(setq tenblmau (laytenblock ent1))
(princ "\nChon vung:")
(setq ss (ss->lst (ssget (list (cons 0 "INSERT")))))
(setq ssblc (List-to-ss (vl-remove-if-not '(lambda (x) (= (laytenblock x) tenblmau)) ss)))
(sssetfirst ssblc ssblc)
(princ)														
)
;;---------------------=={ Select if }==----------------------;;
;;                                                            ;;
;;  Provides continuous selection prompts until either a      ;;
;;  predicate function is validated or a keyword is supplied. ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  msg  - prompt string                                      ;;
;;  pred - optional predicate function [selection list arg]   ;;
;;  func - selection function to invoke                       ;;
;;  keyw - optional initget argument list                     ;;
;;------------------------------------------------------------;;
;;  Returns:  Entity selection list, keyword, or nil          ;;
;;------------------------------------------------------------;;
(defun LM:SelectIf ( msg pred func keyw / sel )
(setq pred (eval pred))
(while
(progn
(setvar 'ERRNO 0)
(if keyw (apply 'initget keyw))
(setq sel (func msg))
(cond
((= 7 (getvar 'ERRNO)) (princ "\nMissed, Try again."))
((eq 'STR (type sel)) nil)
((vl-consp sel) (if (and pred (not (pred sel))) (princ "\nInvalid Object Selected."))))))
sel)
;;;;;;;;;;;;;;;
(defun List-to-ss (lst / ss)
(setq ss (ssadd))
(foreach item lst
 (or (= (type item ) 'Ename)
  (setq item (vlax-vla-object->ename  item)))
 (setq ss (ssadd item ss))
)
ss
)
;;;;;;;;;;;;;;;;;
(defun laytenblock (ent / blk_name)
(if (not (setq blk_name (vlax-get (vlax-Ename->Vla-Object ent) 'Effectivename))) 
(setq blk_name (vla-get-name (vlax-Ename->Vla-Object ent)))
)
blk_name
)
;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ss->lst (ss / lst)
(if ss
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
)
)

 

  • 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
17 giờ trước, Minh Nghĩa đã nói:

Bạn dùng thử lệnh select similar xem, mình thấy lệnh này chọn nhanh đối tượng theo nhiều thuộc tính

Thank! lệnh rất hay mà giờ mới biết. nhưng nó chọn tất cả luôn. không cho chọn đối tượng riêng 1 vù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
Đăng nhập để thực hiện theo  

×