使用Application.Invoke()时,AutoCad命令拒绝“撤消”

时间:2015-09-10 23:12:59

标签: c# .net vb.net autocad

我正在使用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!

1 个答案:

答案 0 :(得分:1)

我认为这是因为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;
}

如果CommandFailed命令失败,您还应该为c:wd_insym2事件添加处理程序。