明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3126|回复: 9

[求助]图块统计的小程序

[复制链接]
发表于 2007-12-10 11:17:00 | 显示全部楼层 |阅读模式
请龙龙仔斑竹编个小程序,统计图块的,思路是:先框选要统计图块的范围,确定后自动统计出数量,要将图块的名称,图层,数量输出到EXCEL,再次执行命令,再次需要统计的图块的名称,图层,数量输出到之前打开的EXCEL的另一个工作表中,(对于被冻结和被锁定的图层里的图块不进行统计),能帮帮我吗?
 楼主| 发表于 2007-12-11 11:36:00 | 显示全部楼层
这个程序对我来说确实有用,希望高手来解答,拜托了
发表于 2007-12-13 11:59:00 | 显示全部楼层
本帖最后由 作者 于 2007-12-15 10:08:48 编辑

(defun blktoale( / selfilter po1 po2 objsel objsellist numblist a n m tmp workbooks actworkbook
           worksheet relrow relcol)
  (setq selfilter(list (cons 0 "insert")))
  (prompt "\n选择要输出的对象<Exit退出>:")
  (initget 1 "Exit")
  (setq po1(getpoint))
  (if (= "Exit" po1) (vl-exit-with-error 1))
  (while (/= "Exit" po1)
    (setq po2(getcorner po1))
    (setq objsel(ssget "c" po1 po2 selfilter));框选块-----------------------
    (if (null objsel) (vl-exit-with-error 1));空选择也退出,否则会出错-------
    (setq n -1)
    (while (< (setq n(1+ n))(sslength objsel))
      (setq objsellist(cons (list (cdr(assoc '2 (entget(ssname objsel n))))
                  (cdr(assoc '8 (entget(ssname objsel n)))))
                objsellist))
    )
  ;得到块的名称和其层的列表objsellist---------------------------------------
  ;要得到数量还要进行列表objsellist的改造,如果名称和层相同则数量加1---------
  (setq numblist nil m 0 );这里也要重新设置为nil,否则会重复计算----------
  (foreach no objsellist
    (progn
      (if (= (vl-position no objsellist) m);说明前面没有名称和层相同的表---
    (progn
      (setq objsel objsellist)
      (setq objsel(vl-remove-if-not  '(lambda(x)(equal x no)) objsel))
      (setq numblist (cons (append no (list (length objsel))) numblist))
    )
    ;不存在相同的块--------------------------------------------------
      )
      (setq m (1+ m))
    )
 )
 ;得到名称,层,数量的列表newobjsellist,下面就是输出到excel的问题了--------
 (DSX-Load-TypeLib-Excel);导入excel库,-----------------------------------
 (setq excel(vlax-get-or-create-object "Excel.Application"))
 (vla-put-visible excel :vlax-true)
 (setq workbooks(vlax-get-property excel 'Workbooks))
 (setq actworkbook(vlax-invoke-method workbooks 'add))
 (setq worksheet(vlax-get-property excel 'activesheet))
 (vla-put-name worksheet "图块统计")
 ;上面新建文档,下面开始输入----------------------------------------------
 (setq relrow 1)
 (foreach x numblist
   (setq relcol 1)
   (foreach y x (msxl-put-value2 (vlax-variant-value
                                       (msxl-get-item (msxl-get-cells worksheet)
                                      (vlax-make-variant relrow)
                                      (vlax-make-variant relcol)))
                y
                )
                (setq relcol(1+ relcol))
     )  
    (setq relrow(1+ relrow))
 )
 (vlax-release-object excel)
 (prompt "\n选择要输出的对象<Exit退出>:")
 (initget 1 "Exit")
 (setq po1(getpoint))
 )
)

;以下采用自
;http://bbs.mjtd.com/forum.php?mod=viewthread&tid=57758&replyID=46333&skin=1
;改动了一下为注册表读取库,2003版本如果自定义安装的话还是注册表比较实用------
(defun DSX-Load-TypeLib-Excel ( / tlbfile tlbver out)
(cond
( (null msxl-xl24HourClock)
(if (findfile(setq tlbfile (strcat (vl-registry-read
                    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE"
                    "Path") "excel.exe")))
(progn
(setq tlbver (substr (vl-filename-base tlbfile) 6))
(cond
( (= tlbver "9")
(princ "\n初始化 Microsoft Excel 2000...") )
( (= tlbver "8")
(princ "\n初始化 Microsoft Excel 97...") )
( (= (vl-filename-base tlbfile) "Excel.exe")
(princ "\n初始化 Microsoft Excel XP...")
)
)
(vlax-import-type-library
:tlb-filename tlbfile
:methods-prefix "msxl-"
:properties-prefix "msxl-"
:constants-prefix "msxl-"
)
(if msxl-xl24HourClock (setq out T))
)
)
)
( T (setq out T) )
)
out
)
 楼主| 发表于 2007-12-13 13:37:00 | 显示全部楼层
谢谢您,是lisp吗,能请您做个附件吗
 楼主| 发表于 2007-12-13 13:40:00 | 显示全部楼层
blktoale 未知命令“BLKTOALE
 楼主| 发表于 2007-12-14 08:24:00 | 显示全部楼层

一切ok,终于搞定,谢谢xxsheng

 楼主| 发表于 2007-12-14 14:39:00 | 显示全部楼层
发现一个错误,本希望相同名称的块如果在不同的层中数量也能分开统计,但目前的程序将在不同的层中相同名称的块的数量进行了合并,期待各位高手帮忙解决
发表于 2011-12-6 13:43:37 | 显示全部楼层
这个用什么命令啊
发表于 2011-12-6 19:41:28 | 显示全部楼层
(defun blktoale( / selfilter po1 po2 objsel objsellist numblist a n m tmp workbooks actworkbook
           worksheet relrow relcol)
改成(defun c:blktoale( / selfilter po1 po2 objsel objsellist numblist a n m tmp workbooks actworkbook
           worksheet relrow relcol)
就可以用命令blktoale加载了。(另存为lsp文件)
发表于 2013-9-3 11:23:15 | 显示全部楼层
好东西,不错,学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-26 09:19 , Processed in 0.197844 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表