这是提供给许多从lisp转移到c#的开发人员的一个函数,这个函数利用后绑代码实现undo返回操作.
这两段代码实现效果一样,只是一个调用了com,一个调用vba.
com接口
public static class Com
{
#if AC2006 || AC2007 || AC2008 || AC2009 || AC2010 || AC2011 || AC2012 public static AcadDocument Adm { get; } = Application.DocumentManager.MdiActiveDocument.AcadDocument as AcadDocument;
#endif #if !HC2020
public static AcadApplication App { get; } = Application.AcadApplication as AcadApplication;
#else
public static GcadApplication App { get; } = Application.AcadApplication as GcadApplication;
#endif
}
com的undo方法:
/// <summary>
/// 命令动作编组 调用Com方法
/// </summary>
/// <param name="flag">true为开始编组,false为结束编组</param>
public static void Undo(bool flag)
{
// kean谈论到undo撤回的操作
// https://www.keanw.com/2008/09/more-quiet-comm.html
string undoCtl = Getvar("UNDOCTL");
if (flag)
{
if (undoCtl == "") //存在活动编组
{
Com.Adm.EndUndoMark();
}
Com.Adm.StartUndoMark();
}
else
{
Com.Adm.EndUndoMark();
}
}
代码是根据VBA手册中调用VBA函数来实现的,而浩辰因为VBA缺失,所以无法使用本函数,应该可以通过发送undo命令来实现?? (20190926留)
本代码由edata提供: edata博客
/// <summary>
/// 命令动作编组 调用VBA方法
/// </summary>
/// <param name="flag">true为开始编组,false为结束编组</param>
public static void UndoVBA(bool flag)
{
//获取CAD程序
object cadApplication = Application.AcadApplication;
//通过反射,获取CAD程序中的所有对象
Type cadType = cadApplication.GetType();
//在所有的对象中.调用成员(对象名字"ActiveDocument",调用属性,返回这个属性的值,粘合剂null,目标程序,附带参数null)
object cadActiveDocument = cadType.InvokeMember("ActiveDocument", BindingFlags.GetProperty, null, cadApplication, null);
Type dcoType = cadActiveDocument.GetType();
//增加动作编组
string undoCtl = Getvar("UNDOCTL");
if (flag)
{
if (undoCtl == "") //存在活动编组
{
dcoType.InvokeMember("EndUndoMark", BindingFlags.InvokeMethod, null, cadActiveDocument, null);
}
dcoType.InvokeMember("StartUndoMark", BindingFlags.InvokeMethod, null, cadActiveDocument, null);
}
else
{
dcoType.InvokeMember("EndUndoMark", BindingFlags.InvokeMethod, null, cadActiveDocument, null);
}
}