cad.net undo编组返回
undo编组返回
C#实现undo返回编组步数的函数.
一个是反射调用内部的方法(内置函数,可参考VBA帮助文档).
一个需要引用com的dll调用com的方法.
需要做到将已经编组的结束,并开始新的编组.
这样不会引起嵌套编组(应该没有嵌套这回事吧).
Acad反射com再调用编组
因为com的dll是版本绑定的,为了泛化版本,所以推荐这个.
using System.Reflection;
namespace JoinBox;
public static partial class CadSystem {
/// <summary>
/// 命令动作编组
/// </summary>
/// <param name="flag"><see langword="true"/>开始编组|<see langword="false"/>结束编组</param>
public static void Undo(bool flag) {
object adoc = TypeTool.Get(Com.App, "ActiveDocument");
if (!flag) {
TypeTool.Set(adoc, "EndUndoMark", null); //结束编组
return;
}
if (Getvar("Undoctl") == "8") //存在活动编组
TypeTool.Set(adoc, "EndUndoMark", null); //结束
TypeTool.Set(adoc, "StartUndoMark", null); //开始
}
下面没有缓存耶....
/// <summary>
/// 获取方法
/// </summary>
/// <param name="obj">获取的对象</param>
/// <param name="fangfaming">方法名</param>
/// <returns></returns>
public static object Get(object obj, string fangfaming) {
return obj.GetType().InvokeMember(fangfaming, BindingFlags.GetProperty, null, obj, null);
}
/// <summary>
/// 设置方法的参数
/// </summary>
/// <param name="obj">设置的对象</param>
/// <param name="fangfaming">方法名</param>
/// <param name="args">参数</param>
/// <returns>设置的对象</returns>
public static object Set(object obj, string fangfaming, object[] args) {
return obj.GetType().InvokeMember(fangfaming, 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 {
if (!flag) {
Com.Adm.EndUndoMark();//结束编组
return;
}
if (Getvar("Undoctl") == "8") {//存在活动编组
Com.Adm.EndUndoMark(); //结束
}
Com.Adm.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错误
明经通道guxl的错误处理帖子
(完)