AutoCad NET使用EntLast带异步命令

本文关键字:异步 命令 EntLast NET 使用 AutoCad | 更新日期: 2023-09-27 18:14:22

正如我在上一个问题中发现的:

AutoCad命令被拒绝"撤消"当使用Application.Invoke()

发送命令c:wd_insym2 (ACad电气命令)似乎不能被同步调用,因为它调用其他命令,如Undo,导致它失败。

但是,我需要存储我刚刚用命令创建的实体的EntityID,使用Lisp (entlast)或Autodesk.AutoCad.Internal.Utils.EntLast()。显然,如果我异步发送命令,这将不会给我正确的结果。

Maxence建议使用文档。命令处理程序,但是我无法想象它将如何适合我的程序流,因为我需要单独执行每个命令,然后将新的EntityID存储在一个。net变量中。

我是否有任何方法可以同步发送这些命令而不会遇到重入问题,或者异步发送命令并等待它们在继续之前执行?

AutoCad NET使用EntLast带异步命令

您是否尝试过Editor.CommandAsync (AutoCAD 2015和+):

[CommandMethod("CMD1")]
public async void Command1()
{
  Document doc = Application.DocumentManager.MdiActiveDocument;
  Editor ed = doc.Editor;
  await ed.CommandAsync("_CMD2");
  ed.WriteMessage("Last entity handle: {0}", Utils.EntLast().Handle);
}
[CommandMethod("CMD2")]
public void Command2()
{
  Document doc = Application.DocumentManager.MdiActiveDocument;
  Database db = doc.Database;
  using (Transaction tr = db.TransactionManager.StartTransaction())
  {
    var line = new Line(new Point3d(), new Point3d(10, 20, 30));
    var currentSpace = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    currentSpace.AppendEntity(line);
    tr.AddNewlyCreatedDBObject(line, true);
    tr.Commit();
  }
}

如果您想在旧版本的AutoCAD中执行此操作,则会更复杂:

List<ObjectId> ids;
[CommandMethod("CMD1")]
public void Cmd1()
{
  Document doc = Application.DocumentManager.MdiActiveDocument;
  ids = new List<ObjectId>();
  doc.CommandEnded += Doc_CommandEnded;
  doc.SendStringToExecute("_CMD2 0 ", false, false, true);
}
private void Doc_CommandEnded(object sender, CommandEventArgs e)
{
  if (e.GlobalCommandName != "CMD2") return;
  ids.Add(Utils.EntLast());
  var doc = (Document) sender;
  if (ids.Count < 10)
  {
    double angle = ids.Count * Math.PI / 10;
    doc.SendStringToExecute("_CMD2 " + Converter.AngleToString(angle) + "'n", false, false, true);
  }
  else
  {
    doc.CommandEnded -= Doc_CommandEnded;
    doc.Editor.WriteMessage("'nHandles: {0}", string.Join(", ", ids.Select(id => id.Handle.ToString())));
  }
}
[CommandMethod("CMD2")]
public void Cmd2()
{
  Document doc = Application.DocumentManager.MdiActiveDocument;
  Database db = doc.Database;
  PromptDoubleResult pdr = doc.Editor.GetAngle("'nAngle: ");
  if (pdr.Status == PromptStatus.Cancel) return;
  using (Transaction tr = db.TransactionManager.StartTransaction())
  {
    var line = new Line(new Point3d(), new Point3d(Math.Cos(pdr.Value), Math.Sin(pdr.Value), 0));
    var currentSpace = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    currentSpace.AppendEntity(line);        
    tr.AddNewlyCreatedDBObject(line, true);
    tr.Commit();
  }
}