cad.net的undo返回操作

这是提供给许多从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
    }
View Code

 

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);
            }
        }

 

你可能感兴趣的:(cad.net的undo返回操作)