为什么当我尝试读取线的起点和终点时 AutoCAD 会抛出致命错误?
Why does AutoCAD throw a fatal error when I try to read line start and end points?
我正在编写一个插件以从 CAD 中提取尽可能多的数据。我现在遇到的主要问题是,例如,当我尝试访问 StartPoint.X 时,脚本失败而没有捕获 "FATAL ERROR: Unhandled Access Violation Reading 0xffffffff at d8e176b4h." 的异常,具体取决于我尝试访问的内容、内存位置以及任何第二个数字变化。示例:
foreach (Objects o in globalListOfObjs)
{
string type = o.obj.GetType().ToString().Split('.').Last();
if (type == "Line")
{
try
{
Line l = (Line)o.obj;
if (l != null)
{
MessageBox.Show("Not Null!");
MessageBox.Show(l.StartPoint.X.ToString());
}
//listOfLines.Add(new LinkLines(lx1, ly1, lx2, ly2, Guid.NewGuid()));
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show(ex.StackTrace);
}
}
}
你的代码是运行在主线程吗? AutoCAD 不支持多线程。
尝试这样的事情:
public void getStartPoint(Transaction oTr, ObjectId oId)
{
try {
Line oLn = (Line)oTr.GetObject(oId, OpenMode.ForRead);
if (oLn != null) {
Interaction.MsgBox(oLn.StartPoint.X.ToString);
}
} catch (System.Exception ex) {
Interaction.MsgBox(ex.StackTrace, (MsgBoxStyle)MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, ex.Message);
}
}
只有当用于打开对象的事务仍然处于活动状态时,才能安全地访问对象。如果您需要存储对对象的引用,请存储 ObjectId 并在需要访问对象属性时启动新事务。
我正在编写一个插件以从 CAD 中提取尽可能多的数据。我现在遇到的主要问题是,例如,当我尝试访问 StartPoint.X 时,脚本失败而没有捕获 "FATAL ERROR: Unhandled Access Violation Reading 0xffffffff at d8e176b4h." 的异常,具体取决于我尝试访问的内容、内存位置以及任何第二个数字变化。示例:
foreach (Objects o in globalListOfObjs)
{
string type = o.obj.GetType().ToString().Split('.').Last();
if (type == "Line")
{
try
{
Line l = (Line)o.obj;
if (l != null)
{
MessageBox.Show("Not Null!");
MessageBox.Show(l.StartPoint.X.ToString());
}
//listOfLines.Add(new LinkLines(lx1, ly1, lx2, ly2, Guid.NewGuid()));
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show(ex.StackTrace);
}
}
}
你的代码是运行在主线程吗? AutoCAD 不支持多线程。
尝试这样的事情:
public void getStartPoint(Transaction oTr, ObjectId oId)
{
try {
Line oLn = (Line)oTr.GetObject(oId, OpenMode.ForRead);
if (oLn != null) {
Interaction.MsgBox(oLn.StartPoint.X.ToString);
}
} catch (System.Exception ex) {
Interaction.MsgBox(ex.StackTrace, (MsgBoxStyle)MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, ex.Message);
}
}
只有当用于打开对象的事务仍然处于活动状态时,才能安全地访问对象。如果您需要存储对对象的引用,请存储 ObjectId 并在需要访问对象属性时启动新事务。