本帖最后由 作者 于 2010-9-30 20:31:44 编辑
这段代码太有价值了。写得很好,我略改一下。
;块计数 (defun countblock (/ blockname count) (setq blockname (cdr (assoc 2 (entget (car (entsel)))))) (setq count (vla-get-count (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blockname))) (alert (strcat "块" blockname "组成元素为: " (itoa count) " 个")) )
;;;-------------------------------------------------------------------------------- ;;;从块选择集中选择指定块名的对象,并返回结果选择集
(defun C:sbn (/ ssObjects listEntityDXF strBlockName intCountSingleBlock)
(setvar "cmdecho" 0) ;不显示命令提示
;;;块统计 (defun intCountSingleBlock (ssOriginal strTargetBlockName / strEntityName listEntityDXF strBlockName intSingleBlockCount k ) (setq intSingleBlockCount 0 k -1 ) (repeat (sslength ssOriginal) ; 循环与所选择的对象数量相等的次数 (setq strEntityName (ssname ssOriginal (setq k (1+ k)))) ; strEntityName,取得第k个对象名 (setq listEntityDXF (entget strEntityName)) (setq strBlockName (cdr (assoc 2 listEntityDXF))) (if (= strBlockName strTargetBlockName) (setq intSingleBlockCount (1+ intSingleBlockCount)) ) ) intSingleBlockCount )
;;;获取整个图形作为选择集 (setq ssObjects (ssget "X" '((0 . "insert") (100 . "AcDbBlockReference"))) ) ; 创建选择集 ssObjects ;;;获取块名 (setq listEntityDXF (entget (car (entsel "\n拾取一个块:")))) (setq strBlockName (cdr (assoc 2 listEntityDXF))) (setq intCountSingleBlock (intCountSingleBlock ssObjects strBlockName) ) (alert (strcat "块" strBlockName "数量为: " (itoa intCountSingleBlock) " 个")) (gc) (princ) ) |