这是提供给从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
(完)