2

我试图在以编程方式插入块之前标记我的绘图,以便如果由于错误而仅部分完成,我可以以编程方式撤消该操作。现在插入方法看起来像这样

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
}
}

MarkPosition 定义为

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() ,但没有成功。

4

2 回答 2

2

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

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

于 2015-04-02T20:45:36.080 回答
0

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

[CommandMethod("nameHere", CommandFlags.Transparent )]

但是由于 SendStringToExecute 是异步的,所以您仍然有问题......您可能需要改用 Editor.Commad。

于 2015-04-29T12:53:56.507 回答