cad.net undo编组返回

undo编组返回

C#实现undo返回编组步数的函数.
一个是反射调用com端口方法,无函数提示(要参考VBA帮助文档).
一个直接引用com的dll调用方法,有函数提示.

需要做到将已经编组的结束,并开始新的编组.
这样不会引起嵌套编组(应该没有嵌套这回事吧).

Acad反射com再调用编组

因为com的dll是版本绑定的,为了泛化版本,所以推荐这个.

using System.Reflection;
namespace JoinBox;

public static partial class CadSystem {
    /// <summary>
    /// 命令动作编组
    /// </summary>
    /// <param name="isStart"><see langword="true"/>开始编组|<see langword="false"/>结束编组</param>
    public static void Undo(bool isStart) {
        object adoc = Get(Com.App, "ActiveDocument");
        if (adoc is null) return;
        if (!isStart) {
            Set(adoc, "EndUndoMark", null);
            return;
        }
        // 存在活动编组就结束,然后开始新的
        if ((short)Acap.GetSystemVariable("Undoctl") == 8)
            Set(adoc, "EndUndoMark", null);
        Set(adoc, "StartUndoMark", null);
    }

    /// <summary>
    /// 获取方法
    /// </summary>
    /// <param name="obj">获取的对象</param>
    /// <param name="funcName">方法名</param>
    /// <returns></returns>
    public static object Get(object obj, string funcName) {
       return obj.GetType().InvokeMember(funcName, BindingFlags.GetProperty, null, obj, null);
    }

    /// <summary>
    /// 设置方法的参数
    /// </summary>
    /// <param name="obj">设置的对象</param>
    /// <param name="funcName">方法名</param>
    /// <param name="args">参数</param>
    /// <returns>设置的对象</returns>
    public static object Set(object obj, string funcName, object[] args) {
        return obj.GetType().InvokeMember(funcName, BindingFlags.InvokeMethod, null, obj, args);
    }
}

Acad引用com文件

之前测试这个方案会报错的,可能是我com的dll引用错误了,
因此最好还是不要直接引用com,而是反射com,因为com是绑定每个版本的.

引用dll文件:
Autodesk.AutoCAD.Interop.Common.dll
Autodesk.AutoCAD.Interop.dll

using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Interop; // 这是acad的com接口
using System.Diagnostics;
namespace JoinBox;

public static class Com {
#if NET35
    public static AcadDocument Adm { get; } = Acap.DocumentManager.MdiActiveDocument.AcadDocument as AcadDocument;
#else
    public static AcadDocument Adm { get; } = Acap.DocumentManager.MdiActiveDocument.GetAcadDocument() as AcadDocument;
#endif

#if !HC2020
    public static AcadApplication App { get; } = Acap.AcadApplication as AcadApplication;
#else
    public static GcadApplication App { get; } = Acap.AcadApplication as GcadApplication;
#endif
}

public static partial class CadSystem {
    /// <summary>
    /// 命令动作编组
    /// </summary>
    /// <param name="flag"><see langword="true"/>开始编组|<see langword="false"/>结束编组</param>
    public static void Undo(bool flag) {
        try {
        var dm = Com.Adm;
        if (dm.Count == 0) return;

        if (!flag) {
            dm.EndUndoMark();
            return;
        }
        // 存在活动编组就结束,然后开始新的
        if ((short)Acap.GetSystemVariable("Undoctl") == 8) {
            dm.EndUndoMark();
        }
        dm.StartUndoMark();
        } catch (System.Exception e) {
            var msg = $"Undo出错,参数{flag},信息:" + e.Message;
            Debug.WriteLine(msg);
            Debugger.Break();
        }
    }

浩辰Gcad引入com文件

引入dll文件:
gcax.tlb

添加命名空间:
using GrxCAD.GraphicsInterface;
using GcadVbaLib;

中望Zcad引入com文件

中望上面实现跟Acad似乎一样,名字改改就好了...
可以在 ZWCAD.exe 反射调用.

引入dll文件:
lnterop.ZWCAD.dll

添加命名空间:
using ZWCAD.Interop;

相关阅读

撤回需要注意事务上面的处理,
cad.net 合并图层错误 ctrl+u出错 !dbenti.cpp@3310:eWasErased错误

arx undo原理

明经通道guxl的错误处理帖子

kean谈论到undo撤回的操作

(完)

posted @   惊惊  阅读(1134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示