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变量中。
我是否有任何方法可以同步发送这些命令而不会遇到重入问题,或者异步发送命令并等待它们在继续之前执行?
您是否尝试过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();
}
}