转载的: (prompt "\n命令为: BC ,用法如下: ") (prompt "\n先选择要统计的块,然后选择要统计的区域,结束后按F2显示出统计数量.") ;;;***************************** ;;;highflybird 2007-2-8 kunming ;;;主程序----------------------- ;;;***************************** (defun C:BC (/ ss1 ss2 NamLst BList str1 str2 f) (graphscr) (prompt "\n请选择要统计的块:") (if (setq ss1 (ssget '((-4 . "<OR") (0 . "INSERT") (0 . "TCH_BLOCK_INSERT") (-4 . "OR>")))) (progn (prompt "\n请选择要统计的区域:") (if (setq ss2 (ssget '((-4 . "<OR") (0 . "INSERT") (0 . "TCH_BLOCK_INSERT") (-4 . "OR>")))) (progn (setq NamLst (Name-list ss1)) (setq BList (Name-count ss2 NamLst)) (setq f (open "blksum.txt" "w")) (princ "\n块名" f) (princ (setq str1 "...............................") f) (princ "数量" f) (princ "\n---------------------------------------" f) (foreach n BList (princ "\n" f) (princ (setq str2 (car n)) f) (princ (substr str1 (1+ (strlen str2)) (strlen str1)) f) (princ "...." f) (princ (cdr n) f) ) (close f) ;关闭文件 (startapp "notepad" "blksum.txt") ;启动记事本打开数据 ) (princ "\n所选区域没有要统计的块!") ) ) (princ "\n你没有选择要统计的块!") ) (princ) ) ;;;图块名列表函数 (defun Name-list (ss1 / i l EName EList BName NList) (setq l (sslength ss1)) (setq i 0 NList nil) ;计数器归零,表清空 (while (< i l) ;对要统计的选择集循环 (setq EName (ssname ss1 i)) ;取得图元名 (setq EList (entget EName)) ;取得图元表 (setq BName (cdr (assoc 2 EList)));取得图块名 (if (not (member BName NList)) ;如果表中没有图块名 (setq NList (cons BName NList)) ;添加到表中 ) (setq i (1+ i)) ;计数器加1 ) NList ) ;;;计数函数 (defun Name-count (ss2 NamLst / blist i l ename elist bname oldcount newcount) (setq Blist (mapcar '(lambda (x) (cons x 0)) NamLst)) ;计数器归零 (setq i 0 l (sslength ss2)) (while (< i l) ;对选择区域循环 (setq ename (ssname ss2 i)) ;取得图元名 (setq elist (entget ename)) ;取得图元表 (setq bname (cdr (assoc 2 elist))) ;取得图块名 (if (member bname NamLst) ;如果是要统计的块 (setq OldCount (assoc bname Blist) ;取得块旧数量 NewCount (1+ (cdr OldCount)) ;+1得到新数量 Blist (subst (cons bname NewCount) OldCount Blist);替代原数量 ) ) (setq i (1+ i)) ;计数器加1 ) BList ) |