明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3315|回复: 7

[基础] 遍历BlockTable?

[复制链接]
发表于 2011-8-8 10:20:31 | 显示全部楼层 |阅读模式
本帖最后由 cdinten 于 2011-8-8 10:21 编辑

请问如何遍历块表下的所有实体?我的项目中实体不多,就20个,烦请给段代码?我记得以前有人给过代码的,现在没找到了
发表于 2011-8-8 19:10:17 | 显示全部楼层
  1.     <CommandMethod("T6")> Public Sub T6()
  2.         Dim db As Database = HostApplicationServices.WorkingDatabase
  3.         Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

  4.         Using trans As Transaction = db.TransactionManager.StartTransaction

  5.             Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
  6.             Dim btr As BlockTableRecord = trans.GetObject(bt.Item(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

  7.             For Each Id As ObjectId In btr
  8.                 Dim obj As DBObject = trans.GetObject(Id, OpenMode.ForWrite)
  9.                 If TypeOf (obj) Is Entity Then
  10.                     ed.WriteMessage(vbCrLf & obj.GetType.ToString)
  11.                 End If
  12.             Next

  13.         End Using

  14.     End Sub
 楼主| 发表于 2011-8-8 20:42:07 | 显示全部楼层
回复 single-yu 的帖子

谢谢,虽然没怎么使用过VB.NET,不过有点VB的基础,然后你的程序写的清晰明了,所以看懂毫无问题,我试试。先谢谢了
发表于 2011-8-8 22:57:20 | 显示全部楼层
找个网上的VB.NET和C#转换就行了,不过稍微有点基础的不难看懂,VB的代码就像用英语写作文一样好懂!
 楼主| 发表于 2011-8-9 09:08:01 | 显示全部楼层
回复 single-yu 的帖子

还好吧,其实你试试C#就知道C#也很简单。就像口头交流一样,虽然没有VB随意,但是语法严谨而又灵活,而且有个好处是C#转VB没问题因为没有可变转换,即使是泛型也可以转化为VB中的类型,但是似乎VB中的Object类型转到C#中不能自动装箱,造成类型不匹配
发表于 2011-8-10 09:01:16 | 显示全部楼层
来个C#代码:

     [CommandMethod("ListEntities")]
        public static void ListEntities()
        {
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                BlockTableRecord acBlkTblRec;
                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
                int nCnt = 0;
                acDoc.Editor.WriteMessage("\nModel space objects: ");
                foreach (ObjectId acObjId in acBlkTblRec)
                {
                    acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.DxfName + acObjId.Handle.ToString());
                    nCnt = nCnt + 1;
                }

                if (nCnt == 0)
                {
                    acDoc.Editor.WriteMessage("\nNo objects found.");
                }
                else
                {
                    acDoc.Editor.WriteMessage("\nTotal {0} objects.", nCnt);
                }

            }
        }
 楼主| 发表于 2011-8-10 14:29:36 | 显示全部楼层
回复 sunchengbo2007 的帖子

谢谢~~~我已经改写过啦~~
发表于 2011-11-29 19:19:17 | 显示全部楼层
学过c语言,看c#久没有多大难度了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 18:19 , Processed in 0.145635 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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