背景
在用.net做CAD经典模式菜单栏功能的时候想要实现打开CAD自动加载,于是经过查阅相关文档和代码运行测试,发现可以通过实现IExtensionApplication
接口的方式达到这个目的。
相关文档说明
- 当AutoCAD装载一个托管程序时,它查询程序的装配件
(assembly)
是否有ExtensionApplication
自定义特性性。如果它找到这个特性,AutoCAD把这个特性所联系的类型作为程序的入口点。如果没有找到这个特性,AutoCAD查找所有实现IExtensionApplication
接口的输出类。如果没有找到相关的接口实现,AutoCAD就会跳过程序的初始化步骤。 ExtensionApplication
特性只能被附加到一个类型。这个被附加的类型必须实现IExtensionApplication
接口。
代码
这里重要的是实现IExtensionApplication
接口,并重写接口的初始化方法和终止方法,以创建一个简单菜单栏并实现自动加载为例体现该解决路径。
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Runtime;
using CadApplication;
[assembly: ExtensionApplication(typeof(AcadNetApp))] //启动时加载工具栏,注意typeof括号里的类库名
namespace CadApplication
{
//实现接口
public class AcadNetApp : IExtensionApplication
{
//重写接口里的初始化方法
public void Initialize()
{
//加载后初始化的程序放在这里 这样程序一加载DLL文件就会执行
var doc = Application.DocumentManager.MdiActiveDocument;
doc.Editor.WriteMessage("\n加载程序中...\n");
//加载菜单栏
AddMenu(doc);
}
//创建菜单栏
public void AddMenu(Document doc)
{
if (Application.AcadApplication is AcadApplication cadApp)
{
var addinMenu = cadApp.MenuGroups.Item(0).Menus.Add("XXX工具");
//命令“DWGTools”后面需要加空格,来代替手动空格,命令逻辑代码这里不进一步展开。
addinMenu.AddMenuItem(addinMenu.Count, "XXX功能", "DWGTools ");
var isShown = false;
foreach (AcadPopupMenu menu in cadApp.MenuBar)
{
if (menu.Name == addinMenu.Name)
{
isShown = true;
break;
}
}
if (!isShown)
{
addinMenu.InsertInMenuBar(cadApp.MenuBar.Count);
}
}
}
//重写接口的终止方法
public void Terminate()
{
//清理程序,可空
}
}
}
作者:RegalZ
根据个人学习经验撰写,如有错误,敬请指正。