【问题标题】:Using AutoCAD API's Document.SendStringToExecute method correctly正确使用 AutoCAD API 的 Document.SendStringToExecute 方法
【发布时间】:2015-04-29 20:53:56
【问题描述】:

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

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

【问题讨论】:

  • 你为什么不直接打电话给MarkPosition呢? (或者可能是ed.Command("UNDO", "M");?)
  • 因为这样做会由于某种原因引发 eInvalidInput 异常
  • 我现在主要使用 RealDWG,但是您可以使用 Transaction 来代替设置撤消标记吗?

标签: c# autocad autocad-plugin


【解决方案1】:

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

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

【讨论】:

  • 正确。使用 SendStringToExecute 执行的命令是异步的,并且在 .NET 命令结束之前不会被调用。这就是首先显示提示的原因。使用事务在代码中处理它。如果你想让 User 有一个 Undo 选项,那么一个快速而肮脏的方法是让你自己的函数也从 sendstring 开始在一个 undo 标记之后执行。
  • 我不能只指望事务的性质,因为我想做多个事务和非事务方法的组合,并在任何时候出现故障时将它们全部回滚
  • 事务的性质是完全可以预测的,而 sendStringtoExecute 的性质则不是 :-)。在我看来,嵌套事务并在事务中添加“非事务方法”没有任何问题。
  • 您可以尝试使用 TopTransaction 在一个撤消步骤中封装该批次:spiderinnet1.typepad.com/blog/2012/06/…
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 2018-04-29
    • 2017-02-26
    • 1970-01-01
    • 2013-08-04
    • 2018-10-07
    • 2017-07-08
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多