使用 Application.Invoke() 时 AutoCad 命令被拒绝 "Undo"
AutoCad Command Rejected "Undo" when using Application.Invoke()
我正在使用 Application.Invoke() 在 AutoCad 中同步调用 AutoLisp 命令。我的大部分命令都可以正常工作,但有几个命令出现错误
Error: AutoCAD command rejected: "_.UNDO"
这些命令特别是 AutoCad Electrical 命令,例如 c:ace_insertwire 和 c:wd_insym2。
这是我的代码:
Using rb As New ResultBuffer()
rb.Add(New TypedValue(LispDataType.Text, "c:wd_insym2"))
rb.Add(New TypedValue(LispDataType.Text, name))
rb.Add(New TypedValue(LispDataType.ListBegin))
rb.Add(New TypedValue(LispDataType.Double, coords(0)))
rb.Add(New TypedValue(LispDataType.Double, coords(1)))
rb.Add(New TypedValue(LispDataType.ListEnd))
rb.Add(New TypedValue(LispDataType.Nil))
rb.Add(New TypedValue(LispDataType.Nil))
Autodesk.AutoCAD.ApplicationServices.Application.Invoke(rb)
End Using
这相当于
(c:wd_insym2 "C:/ace_blocks/HT00_001.dwg" '(150 230) nil nil)
效果很好。
当我对 ace_insert_wire 使用相同的方法时,它给了我一个额外的错误:
Error: AutoCAD command rejected: "_.UNDO" AutoCAD command rejected: "_.REDRAW"
知道是什么原因造成的吗?我当然没有调用 UNDO 或 REDRAW!
我认为这是因为 c:wd_insym2
正在调用这些命令。它失败了,因为您自己的命令已经处于活动状态。您需要使用 SendStringToExecute
或 Editor.Command/CommandAsync
异步调用此命令。如果您需要在命令执行后进行额外处理,请将处理程序添加到 CommandEnded
事件:
doc.CommandEnded += doc_CommandEnded;
doc.SendStringToExecute("(c:wd_insym2 "C:/ace_blocks/HT00_001.dwg" '(150 230) nil nil)", false, false, false);
[..]
void doc_CommandEnded(object sender, CommandEventArgs args)
{
// Do what you need to do
// Remove the handler
doc.CommandEnded -= doc_CommandEnded;
}
如果 c:wd_insym2
命令失败,您还应该向 CommandFailed
事件添加一个处理程序。
我正在使用 Application.Invoke() 在 AutoCad 中同步调用 AutoLisp 命令。我的大部分命令都可以正常工作,但有几个命令出现错误
Error: AutoCAD command rejected: "_.UNDO"
这些命令特别是 AutoCad Electrical 命令,例如 c:ace_insertwire 和 c:wd_insym2。
这是我的代码:
Using rb As New ResultBuffer()
rb.Add(New TypedValue(LispDataType.Text, "c:wd_insym2"))
rb.Add(New TypedValue(LispDataType.Text, name))
rb.Add(New TypedValue(LispDataType.ListBegin))
rb.Add(New TypedValue(LispDataType.Double, coords(0)))
rb.Add(New TypedValue(LispDataType.Double, coords(1)))
rb.Add(New TypedValue(LispDataType.ListEnd))
rb.Add(New TypedValue(LispDataType.Nil))
rb.Add(New TypedValue(LispDataType.Nil))
Autodesk.AutoCAD.ApplicationServices.Application.Invoke(rb)
End Using
这相当于
(c:wd_insym2 "C:/ace_blocks/HT00_001.dwg" '(150 230) nil nil)
效果很好。
当我对 ace_insert_wire 使用相同的方法时,它给了我一个额外的错误:
Error: AutoCAD command rejected: "_.UNDO" AutoCAD command rejected: "_.REDRAW"
知道是什么原因造成的吗?我当然没有调用 UNDO 或 REDRAW!
我认为这是因为 c:wd_insym2
正在调用这些命令。它失败了,因为您自己的命令已经处于活动状态。您需要使用 SendStringToExecute
或 Editor.Command/CommandAsync
异步调用此命令。如果您需要在命令执行后进行额外处理,请将处理程序添加到 CommandEnded
事件:
doc.CommandEnded += doc_CommandEnded;
doc.SendStringToExecute("(c:wd_insym2 "C:/ace_blocks/HT00_001.dwg" '(150 230) nil nil)", false, false, false);
[..]
void doc_CommandEnded(object sender, CommandEventArgs args)
{
// Do what you need to do
// Remove the handler
doc.CommandEnded -= doc_CommandEnded;
}
如果 c:wd_insym2
命令失败,您还应该向 CommandFailed
事件添加一个处理程序。