这是提供给许多从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方法:
////// 命令动作编组 调用Com方法 /// /// true为开始编组,false为结束编组 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 == "8") //存在活动编组 { Com.Adm.EndUndoMark(); } Com.Adm.StartUndoMark(); } else { Com.Adm.EndUndoMark(); } }
代码是根据VBA手册中调用VBA函数来实现的,而浩辰因为VBA缺失,所以无法使用本函数,应该可以通过发送undo命令来实现?? (20190926留)
本代码由edata提供: edata博客
////// 命令动作编组 调用VBA方法 /// /// true为开始编组,false为结束编组 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 == "8") //存在活动编组 { 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); } }