如何找到布局是否为空?
您好,可以区分布局是否为空吗?
我需要在大量的绘图中检查这个例程,所以请告诉我一些找到空布局的简单方法。
预先感谢,
然后
**** Hidden Message ***** 类似这样的内容应该可以帮助您入门: 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,开放模式。ForRead)作为BlockTableRecord。
foreach(acBlkTblRec中的ObjectId id)。
{。
//将每个objectid作为一个实体获取,如果它不为空(它是一个“实体”),则添加到计数中:。
实体ent = tr,GetObject(id,OpenMode。ForRead)作为实体;// 'as '失败时返回null 。
如果(ent!= null)。
{。
ents++;。
}。
}。
}。
返回ents。
}。
您好,MickD,
感谢您的快速回复。这会给我一个好的开始。
很抱歉没有解释清楚。
例如。在包含模型和12个布局图中。在12布局中,我需要找到哪个布局是空的。[循环布局]
我希望我现在解释清楚了。再次感谢,然后 好的,这里有一个片段可以给你一些想法:。
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以供在其他地方使用:。
}。
}。
。
}。
。
。
你好,迈克,
谢谢。它工作正常。再次感谢,然后 没问题,我只是碰巧打开了一个项目,在那里我使用了类似的代码,所以只是抓取了一些片段放在一起作为(未经测试的)例子,干杯。 嗨,您可以通过仅计算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();。
}。
更优雅的解决方案gile
我的是一种暴力方法,知道在布局中除了实体还有其他带有ObjectIds的“东西”,并且不确定我是否安全,你的解决方案更好,干杯。 嗨,Gile,
真棒代码.您的解决方案提高了性能。
再次感谢
,然后
目前我无法抽出时间进行测试,但是-
Assembly:Acmgd,
声明类型:Autodesk.AutoCAD.Internal。LayoutThumbnailEnumerator<br>公共布尔<strong>IsLayoutEmpty</strong>{get;}
页:
[1]
2