giskumar 发表于 2022-7-6 22:25:12

使用两个文档

你好
 
我想在一个命令中处理两个文档。
我编写测试代码。但它不起作用。
 
请提出任何意见。
 

[CommandMethod("pp")]
publicvoid PlaceDntAno()
{
Document AcadDoc = AcadApp.DocumentManager.MdiActiveDocument;
Database AcadDB = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Editor ED = AcadDoc.Editor;
DocumentCollection AcadDocs = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
string tmp = "";
foreach (Document AcadDoc_temp in AcadDocs)
{
if (AcadDoc_temp != AcadDoc)
{

Transaction TR = AcadDoc_temp.TransactionManager.StartTransaction();
using (TR)
{
AcadApp.DocumentManager.MdiActiveDocument = AcadDoc_temp;
Editor ED1 = AcadDoc_temp.Editor;
PromptEntityResult PER = ED1.GetEntity("\nSelect Text::");
if (PER.Status == PromptStatus.OK)
{
ObjectId ObjID = PER.ObjectId;
DBObject DBObj = TR.GetObject(ObjID, OpenMode.ForRead);
tmp = DBObj.ToString();
}
}
TR.Commit();
TR.Dispose();
}
}
AcadApp.DocumentManager.MdiActiveDocument = AcadDoc;
MessageBox.Show(tmp);
}

 
 
谢谢
库马尔。

BlackBox 发表于 2022-7-6 22:42:12

我不确定我是否理解你想做什么。。。。
 
首先,让我们确保在Visual Studio“错误列表”中查找错误,该列表应该告诉您:
 
只需替换此行:
换言之:
深入了解逻辑,似乎您正试图在DocumentManager中迭代每个文档,将其设置为MdiActiveDocument,然后提示用户选择一些文本,如果返回有效的PromptStatus,则向用户显示所选对象的DBObject。
 
不幸的是,您拨打了MessageBox。Show()不在foreach循环的范围内,每次成功选择后,您都会重复覆盖字符串tmp的值。。。这意味着将只存储最后一个选择的有效DBObject,并因此显示。

BlackBox 发表于 2022-7-6 22:48:34

 
也许缓解这种情况的一种方法是替换这条线路:
 
 
使用此代码段:
一旦foreach循环结束,它应该将每个有效的DBObject存储在自己的行中。
 
此外,除非我忽略了什么,否则只需提交()事务,并且不调用Dispose()方法。
 

                   TR.Commit();
                   //TR.Dispose();

BlackBox 发表于 2022-7-6 22:56:58

此外,您忽略了发布此CommandMethod所在的类。。。该类是否被指定为静态类?

giskumar 发表于 2022-7-6 23:13:15

你好,RenderMan,
 
谢谢你的回复。
 
最后,我通过指定为static并设置CommandFlags解决了这个问题。会话如下所示。
 
4

BlackBox 发表于 2022-7-6 23:22:27

 
... 我很高兴你把它整理好了,但更重要的是,你明白这为什么解决了你的问题吗?

btraemoore 发表于 2022-7-6 23:29:41

 
 
只是为了好玩。。。如果要优化:
 
5
页: [1]
查看完整版本: 使用两个文档