C# 使用AutoCAD API';s Document.SendStringToExecute方法是否正确

C# 使用AutoCAD API';s Document.SendStringToExecute方法是否正确,c#,autocad,autocad-plugin,C#,Autocad,Autocad Plugin,我试图在以编程方式插入块之前标记图形,以便在操作由于错误而仅部分完成时,可以以编程方式撤消该操作。现在,insert方法如下所示 public void askForInsertionPoint { StateManagementExtensions.MarkPosition(); try { PromptPointResult pr = ed.GetPoint("\nSelect insertion point: "); Point3d insPt = pr.Value; }

我试图在以编程方式插入块之前标记图形,以便在操作由于错误而仅部分完成时,可以以编程方式撤消该操作。现在,insert方法如下所示

public void askForInsertionPoint
{
StateManagementExtensions.MarkPosition();
try
{
    PromptPointResult pr = ed.GetPoint("\nSelect insertion point: ");
    Point3d insPt = pr.Value;
}
catch(Exception e)
{
 //TODO handle exception with undo
}
}
标记位置定义为

public static void MarkPosition()
{
doc.SendStringToExecute("MARKPOS ", true, false, true);
}
最后,如上所述将MARKPOS发送到命令行调用此方法

[CommandMethod("MARKPOS")]
public void MarkPosition()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
ed.Command("UNDO", "M");
}

pointprompt以某种方式击败了对AutoCAD命令行的MARKPOS调用,因此它尝试输入MARKPOS作为插入点,而不是暂停C#方法以等待MARKPOS作为命令执行。在提示插入点之前,如何向程序发送信号,使其等待并执行MARKPOS命令?我在SendStringToExecute调用后尝试了Thread.sleep(),但没有成功。

将函数包装到事务中。如果事务未提交,则无需回滚任何内容


如果你想成为一个完美主义者,在例程开始时存储当前视图位置,这样你可以在命令后重置缩放/位置。

在另一个命令中调用一个命令需要第一个命令是透明的

[CommandMethod(“nameHere”,CommandFlags.Transparent)]


但是,由于SendStringToExecute是异步的,因此仍然存在问题。。。您可能需要改用Editor.Commad。

为什么不直接调用
MarkPosition
?(或者可能是
ed.Command(“UNDO”,“M”);
?)因为出于某种原因,这样做会引发eInvalidInput异常我现在主要使用RealDWG,但是您是否可以使用而不是设置UNDO标记?正确。使用SendStringToExecute执行的命令是异步的,在.NET命令结束之前不会调用。这就是为什么首先显示pointprompt。使用事务在代码内部处理它。如果希望用户具有撤消选项,然后,一个快速而肮脏的方法是让您自己的函数也从sendstring开始,在撤销标记后执行。我不能仅仅依靠事务的性质,因为我想组合多个事务和非事务方法,并在任何时候出现故障时将它们全部回滚事务的性质非常复杂可预测,其中sendStringtoExecute的本质不是:-)。在我看来,将交易嵌套并在交易中添加“非交易方法”没有错。您可以尝试使用TopTransaction在一个撤消步骤中封装该批次: