zoukankan      html  css  js  c++  java
  • cad.net undo返回操作

    这是提供给从lisp转移到c#实现undo返回步数的函数.

    一个需要引用com的dll调用com的方法,
    一个是反射调用内部的方法(它的本质也是调用com,只是你不需要引用了,可参考VBA帮助文档).

    Acad上面调用

    引用com的dll

    引用dll:

    lnterop.ACAD.dll

    添加命名空间:

    using Autodesk.AutoCAD.Interop.Common;

    using Autodesk.AutoCAD.Interop; //引用com类库

        public static class Com
        {
    #if AC2006 || AC2007 || AC2008 || AC2009 || AC20081 || AC2011 || AC2012 
            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; } = Application.AcadApplication as GcadApplication;
    #endif
        }
    

    引用com的dll实现:

    需要做到将已经编组的结束并开始新的编组.
    这样不会引起嵌套编组.

    /// <summary>
    /// 命令动作编组
    /// </summary>
    /// <param name="flag"><see langword="true"/>开始编组|<see langword="false"/>结束编组</param> 
    public static void Undo(bool flag)
    {
        try
        {
            string undoCtl = Getvar("UNDOCTL");
            if(flag)
            {
                 if(undoCtl == "8")//存在活动编组
                 {
                       Com.Adm.EndUndoMark();//结束编组
                 }
                 Com.Adm.StartUndoMark();//再开始编组
            }
            else
            {
                Com.Adm.EndUndoMark();//结束编组
            }
        }
        catch (System.Exception e)
        {
            throw new System.Exception($"undo出错::参数{flag}::信息::" + e.Message);
        }
    }
    

    反射调用:

    本代码由edata提供:

    /// <summary>
    /// 命令动作编组
    /// </summary>
    /// <param name="flag"><see langword="true"/>开始编组|<see langword="false"/>结束编组</param> 
    public static void Undo(bool flag)
    {
        //获取CAD程序 
        object cadApplication = Application.AcadApplication;
        //反射获取CAD类型
        Type cadType = cadApplication.GetType();
        //从类型中反射当前的激活文档
        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);
        }
    }
    

    Gcad浩辰上面调用

    引入命名空间:

    using GcadVbaLib; //浩辰的com

    (然后按照如上代码就可以了...太久了忘记了...)

    Zcad中望上面调用

    中望上面实现跟Acad似乎一样,名字改改就好了...

    可以在ZWCAD.EXE反射调用.

    引用 lnterop.ZWCAD.dll
    添加命名空间:
    using ZWCAD.Interop; //中望的com

    (完)

  • 相关阅读:
    自我介绍
    企业级应用与互联网应用差异
    Java EE 目标
    自我评价
    第二周———搜查令
    软件工程项目____搜查令
    结对项目--黄金点游戏(邓乐&曾亮)
    wordcount程序
    四则运算 来自 http://www.cnblogs.com/ys1101/p/4368103.html
    问题
  • 原文地址:https://www.cnblogs.com/JJBox/p/10214582.html
Copyright © 2011-2022 走看看