TheCaconym 发表于 2021-1-13 10:40:42

枚举 AcSmSheet 列表时的 CTD

大家好。正如主题所述,我在枚举已构建的AcSmSheet列表时遇到了崩溃到桌面(AutoCad)的情况。通过CTD,我的意思是它甚至跳过了致命错误对话框。我试图理解这种行为,因为它对我来说很奇怪,几个月来我一直试图确定问题的根源,但无济于事。如果我的解释很长,我很抱歉,但我希望更多的信息能帮助我们解决问题。
我有一个表单,允许用户选择所需的图纸集文件并管理要在图纸上运行的任务。它循环访问并收集 AcSmSheets、IAcSmSheets2,并提取文件路径、修订数据、文件名、布局名称,并将它们全部存储在自己的列表中。我可以在表单中枚举AcSmSheets列表,并使用
foreach (AcSmSheet sh in SheetSet.smSheets)
{
   string path = sh.GetLayout().GetFileName();
   if (!string.IsNullOrEmpty(path))
   {
          label1.Text += path + "\n";
          checkedListBox1.Items.Add((object)path, true);
          //OpenDoc(path); //alternatively, run these methods
          //Task(mode);
          //CloseDoc(path);
   }
}

列出所有文件路径,这按预期工作,并且它正确返回文件路径。伟大。现在我被引导(错误地)相信我的代码应该正常工作。
在另一个类中,我想获取相同的数据并对其进行迭代,从文件路径中打开每个dwg以运行某些任务并保存并关闭。
我将在窗体之外使用相同的代码,并且它不起作用。它将进入 foreach 循环,获取第一个路径,打开,执行任务,保存并关闭,移动到下一个枚举,并在“字符串路径 = sh.GetLayout().GetFileName();“ 行.在一个实例中,它正确地获取所有文件路径。在另一个实例中,它只得到第一个。
我的理解是,当autocad尝试评估空值时,它将进行CTD。我想知道在第一个.dwg打开后,数据是否被丢弃了,但事实并非如此。我正在使用CommandFlags.Session,并且已经找到了一种使代码工作的替代方法,但它并不理想。如果我使用相同的代码,但使用
foreach (string path in SheetSet.pathList)
{...}

,它的工作原理,但这只允许我枚举路径,当我想处理的不仅仅是路径(修订数据,布局信息)时。
因此,在打开文档时不会清除数据。是什么让 AcSmSheet 变为 null(如果是的话)?
提前感谢任何回复。
**** Hidden Message *****
页: [1]
查看完整版本: 枚举 AcSmSheet 列表时的 CTD