乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 161|回复: 11

如何找到布局是否为空?

[复制链接]

3

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
20
发表于 2014-4-27 21:54:33 | 显示全部楼层 |阅读模式
您好,
可以区分布局是否为空吗?
我需要在大量的绘图中检查这个例程,所以请告诉我一些找到空布局的简单方法。
预先感谢,
然后

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2014-4-27 22:48:08 | 显示全部楼层
类似这样的内容应该可以帮助您入门:    private int GetEntityCount(Database db)。
{。
int ents = 0;。

使用(事务tr = db,transaction manager . start transaction())。
{。
//从图形中获取块表:。
BlockTable acBlkTbl。
acBlkTbl = tr,GetObject(db,BlockTableId,OpenMode。ForRead)作为块表;。

//打开块表记录模型空间进行读取。
block table record acBlkTblRec;。
acBlkTblRec = tr,GetObject(acBlkTbl[block table record,模型空间],开放模式。ForRead)作为BlockTableRecord。
foreach(acBlkTblRec中的ObjectId id)。
{。
//将每个objectid作为一个实体获取,如果它不为空(它是一个“实体”),则添加到计数中:。
实体ent = tr,GetObject(id,OpenMode。ForRead)作为实体;// 'as '失败时返回null 。
如果(ent!= null)。
{。
ents++;。
}。
}。
}。
返回ents。
}。
回复

使用道具 举报

3

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
20
发表于 2014-4-28 00:42:21 | 显示全部楼层
您好,MickD,
感谢您的快速回复。这会给我一个好的开始。
很抱歉没有解释清楚。
例如。在包含模型和12个布局图中。在12布局中,我需要找到哪个布局是空的。[循环布局]
我希望我现在解释清楚了。再次感谢,然后
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2014-4-28 01:47:37 | 显示全部楼层
好的,这里有一个片段可以给你一些想法:。
int ents=0;。
使用(_AcDb.Transactiontr=db.TransactionManager.StartTransaction())。
{。
//获取布局字典:。
_AcDb.DBDictionary布局=(_AcDb.DBDictionary)tr.GetObject(db.LayoutDictionaryId_AcDb.OpenMode.ForRead);。
字符串键 = ""; // 在中存储布局名称。

foreach(_布局中的AcDb.DBDictionaryEntry布局)。
{。
//重置计数:。
ents=0;。

//使用布局名称作为键:。
关键layout.Key。

//获取布局对象temp以获取id:。
布局tmpLayout=(布局)tr.GetObject(layouts.GetAt(键),OpenMode.ForRead);。
ObjectId layoutId=tmpLayout.BlockTableRecordId;。

//打开读取布局的块表记录。
BlockTableRecord acBlkTblRec=tr.GetObject(layoutId,OpenMode.ForRead)as BlockTableRecord;。

//迭代绘图实体的块表记录:。
foreach(acBlkTblRec中的ObjectId id)。
{。
//获取每个对象作为一个实体,如果它不为空(它是一个'Entity')添加到计数:。
Entity ent=tr.GetObject(id,OpenMode.ForRead)as Entity;//'as'在失败时返回null。
如果(ent!=null)。
{。
ents++;。
}。
}。

//如果您到达这里并且ents计数仍然为零,则您没有ents:。
如果(ents==0)。
{。
//做一些事情,比如保存布局ID以供在其他地方使用:。
}。
}。

}。


回复

使用道具 举报

3

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
20
发表于 2014-4-28 02:52:48 | 显示全部楼层
你好,迈克,
谢谢。它工作正常。再次感谢,然后
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2014-4-28 02:56:37 | 显示全部楼层
没问题,我只是碰巧打开了一个项目,在那里我使用了类似的代码,所以只是抓取了一些片段放在一起作为(未经测试的)例子,干杯。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-4-28 03:51:57 | 显示全部楼层
嗨,您可以通过仅计算BlockTableRecord中包含的ObjectId来避免将每个对象作为实体打开。请记住,每个纸张空间布局都包含自己的视口。因此,纸张空间中的 1 个 ObjectId 布局 BlockTableRecord 表示空布局。 Document doc = AcAp.DocumentManager.MdiActiveDocument;。
数据库 db = doc,数据库;。
编辑器 ed = 文档,编辑;。

using (Transaction tr = db.TransactionManager.StartTransaction())。
{。
var layouts = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);。
foreach (布局中的 var 条目)。
{。
var layout = (Layout)tr.GetObject(entry.Value, OpenMode.ForRead);。
var btr = (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForRead);。
编辑,WriteMessage(“\n{0} 包含{1} ObjectId.”,布局。布局名称,btr。演员(),计数());。
}。
断续器Commit();。
}。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2014-4-28 04:00:03 | 显示全部楼层
更优雅的解决方案gile
我的是一种暴力方法,知道在布局中除了实体还有其他带有ObjectIds的“东西”,并且不确定我是否安全,你的解决方案更好,干杯。
回复

使用道具 举报

3

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
20
发表于 2014-4-28 05:21:01 | 显示全部楼层
嗨,Gile,
真棒代码.您的解决方案提高了性能。
再次感谢
,然后
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2014-4-28 17:09:15 | 显示全部楼层

目前我无法抽出时间进行测试,但是-
Assembly:Acmgd,
声明类型:Autodesk.AutoCAD.Internal。LayoutThumbnailEnumerator<br>公共布尔<strong>IsLayoutEmpty</strong>{get;}
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 06:44 , Processed in 0.282033 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表