【发布时间】:2017-04-25 01:45:34
【问题描述】:
我正在编写一个通过 AutoCAD .NET API 与 AutoCAD 交互的 C#.NET 程序。程序循环遍历目录中的 DWG 文件并检查“testLayer”层上的每个文本实体,看它是否与“testText”匹配。我通过打开每个文件并制作一个选择过滤器来获取“testLayer”层上的所有实体来实现这一点。
Application.DocumentManager.Open(curfile.FullName, false);
....
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction acTrans = doc.TransactionManager.StartTransaction())
{
ObjectIdCollection ents = new ObjectIdCollection();
// Set up filter and filter on layer name
TypedValue[] tvs = new TypedValue[1] { new TypedValue((int)DxfCode.LayerName, "testLayer")};
SelectionFilter sf = new SelectionFilter(tvs);
PromptSelectionResult psr = ed.SelectAll(sf);
if (psr.Status == PromptStatus.OK)
{
// Get the object ids for all of the entities for the filtered layer
ents = new ObjectIdCollection(psr.Value.GetObjectIds());
foreach (ObjectId objid in ents)
{
DBText dbText = acTrans.GetObject(objid, OpenMode.ForRead) as DBText;
if (dbText.TextString.Contains("testText")
{
return dbText.TextString;
}
}
return "";
}
else
{
return "";
}
}
}
但现在我将我的程序转换为侧加载底层数据库,因为程序打开和关闭每个 .DWG 文件需要很长时间。问题是我现在正在使用
db.ReadDwgFile(currentDWG, FileOpenMode.OpenForReadAndAllShare, true, string.Empty);
读取文件而不实际打开它们,所以我不能使用
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor
和
ed.SelectAll(sf) 用于我之前使用的选择过滤器策略,因为该文档实际上并未打开。那么如何在不实际打开 DWG 文件的情况下获取每个名为“testLayer”的图层上的所有文本实体呢?
【问题讨论】: